着信接続のすべての処理を行うためにプリロードされた別のスレッドを持つ python3.3 でサーバーを実装しようとしています。
from multiprocessing import Process, Pipe, Queue
from multiprocessing.reduction import reduce_socket
import time
import socketserver,socket
def process(q):
while 1:
fn,args = q.get()
conn = fn(*args)
while conn.recv(1, socket.MSG_PEEK):
buf = conn.recv(100)
if not buf: break
conn.send(b"Got it: ")
conn.send(buf)
conn.close()
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
print("Opening connection")
print("Processing")
self.server.q.put(reduce_socket(self.request))
while self.request.recv(1, socket.MSG_PEEK):
time.sleep(1)
print("Closing connection")
class MyServer(socketserver.ForkingTCPServer):
p = Process
q = Queue()
parent_conn,child_conn = Pipe()
def __init__(self,server_address,handler):
socketserver.ForkingTCPServer.__init__(self,server_address, handler)
self.p = Process(target=process,args=(self.q,))
self.p.start()
def __del__(self):
self.p.join()
server_address = ('',9999)
myserver = MyServer(server_address,MyHandler)
myserver.serve_forever()
次のスクリプトを使用して動作することをテストできます。
from multiprocessing.reduction import reduce_socket
import time
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 9999))
time.sleep(1)
print("reduce_socket(s)")
fn,args = reduce_socket(s)
time.sleep(1)
print("rebuild_socket(s)")
conn = fn(*args)
time.sleep(1)
print("using_socket(s)")
conn.send("poks")
print conn.recv(255)
conn.send("poks")
print conn.recv(255)
conn.send("")
print conn.recv(255)
conn.close()
残念ながら、テストを n 回実行した後、私の tmp-folder はサブフォルダーで満たされているため、何か問題があるようです。
$ ls /tmp/pymp*|wc -l
32000
これらの一時ファイルは、によって作成されsocket_reduce()
ます。興味深いことに、rebuild/reduce_socket()
クライアントの も一時ファイルを作成しますが、関数が終了すると削除されます。現在の tmp-filesystem 内のフォルダーの最大数は 32000 であり、問題が発生します。/tmp/pymp*-files を手動またはサーバーのどこかで削除することもできますが、これを行う正しい方法もあるはずです。誰でもこれで私を助けることができますか?