マルチプロセッシングモジュールを使用しており、プールを使用して複数のワーカーを起動しています。ただし、親プロセスで開かれるファイル記述子は、ワーカープロセスで閉じられます。開いてほしい..!親と子の間で共有されるファイル記述子を渡す方法はありますか?
4 に答える
Python2およびPython3では、ファイル記述子を送受信するための関数がmultiprocessing.reduction
モジュールに存在します。
サンプルコード(Python2およびPython3):
import multiprocessing
import os
# Before fork
child_pipe, parent_pipe = multiprocessing.Pipe(duplex=True)
child_pid = os.fork()
if child_pid:
# Inside parent process
import multiprocessing.reduction
import socket
# has socket_to_pass socket object which want to pass to the child
socket_to_pass = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
socket_to_pass.connect("/dev/log")
# child_pid argument to send_handle() can be arbitrary on Unix,
# on Windows it has to be child PID
multiprocessing.reduction.send_handle(parent_pipe, socket_to_pass.fileno(), child_pid)
socket_to_pass.send("hello from the parent process\n".encode())
else:
# Inside child process
import multiprocessing.reduction
import socket
import os
fd = multiprocessing.reduction.recv_handle(child_pipe)
# rebuild the socket object from fd
received_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
# socket.fromfd() duplicates fd, so we can close the received one
os.close(fd)
# and now you can communicate using the received socket
received_socket.send("hello from the child process\n".encode())
multiprocessing
と呼ばれるフォークもありmultiprocess
、これは。に置き換えpickle
られdill
ます。 dill
ファイル記述子をピクルスmultiprocess
できるため、プロセス間で簡単に渡すことができます。
>>> f = open('test.txt', 'w')
>>> _ = map(f.write, 'hello world')
>>> f.close()
>>> import multiprocess as mp
>>> p = mp.Pool()
>>> f = open('test.txt', 'r')
>>> p.apply(lambda x:x, f)
'hello world'
>>> f.read()
'hello world'
>>> f.close()
multiprocessing
それ自体には、WindowsおよびUnixプラットフォーム上のプロセス間でファイル記述子を転送するためのヘルパーメソッドがあり、multiprocessing.reduction
:send_handle
および。のUnixドメインソケットを介したファイル記述子の送信をサポートしていますrecv_handle
。これらは文書化されていませんが、モジュール内にある__all__
ため、パブリックAPIの一部であると想定しても安全な場合があります。ソースから、これらは少なくとも2.6+および3.3+以降利用可能であるように見えます。
すべてのプラットフォームのインターフェースは同じです。
send_handle(conn, handle, destination_pid)
recv_handle(conn)
どこ:
conn
(multiprocessing.Connection
):ファイル記述子を送信する接続handle
(int
):ファイル記述子/ハンドルを参照する整数destination_pid
(int
):ファイル記述子を受信しているプロセスの整数pid-これは現在Windowsでのみ使用されています
プロセス間でファイル記述子を共有する方法はありません。方法が存在する場合、それはおそらくOS固有です。
私の推測では、別のレベルでデータを共有する必要があります。