4

クライアントごとに multiprocessing.Process を使用するサーバーを作成しています。親プロセスで socket.accept() が呼び出され、接続オブジェクトが引数としてプロセスに渡されます。

問題は、socket.close() を呼び出したときにソケットが閉じていないように見えることです。クライアントの recv() は、サーバーで close() が呼び出された直後に戻る必要があります。これは、threading.Thread を使用する場合、またはメイン スレッドで要求を処理する場合に当てはまりますが、マルチプロセッシングを使用する場合、クライアントの recv は永遠にハングしているように見えます。

一部の情報源は、ソケット オブジェクトをハンドルとして multiprocessing.Pipes および multiprocess.reduction と共有する必要があることを示していますが、違いはないようです。

編集: Linux 64 ビットで Python 2.7.4 を使用しています。

以下は、この問題を示すサンプル実装です。

サーバー.py

import socket
from multiprocessing import Process
#from threading import Thread as Process

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5001))
s.listen(5)

def process(s):
    print "accepted"
    s.close()
    print "closed"

while True:
    print "accepting"
    c, _ = s.accept()
    p = Process(target=process, args=(c,))
    p.start()
    print "started process"

client.py

import socket

s = socket.socket()
s.connect(('', 5001))
print "connected"
buf = s.recv(1024)

print "buf: '" + buf +"'"

s.close()
4

1 に答える 1