8

マルチプロセッシングモジュールを使用しており、プールを使用して複数のワーカーを起動しています。ただし、親プロセスで開かれるファイル記述子は、ワーカープロセスで閉じられます。開いてほしい..!親と子の間で共有されるファイル記述子を渡す方法はありますか?

4

4 に答える 4

9

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())
于 2014-12-31T05:06:41.647 に答える
3

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()
于 2016-04-01T21:52:36.417 に答える
2

multiprocessingそれ自体には、WindowsおよびUnixプラットフォーム上のプロセス間でファイル記述子を転送するためのヘルパーメソッドがあり、multiprocessing.reductionsend_handleおよび。のUnixドメインソケットを介したファイル記述子の送信をサポートしていますrecv_handle。これらは文書化されていませんが、モジュール内にある__all__ため、パブリックAPIの一部であると想定しても安全な場合があります。ソースから、これらは少なくとも2.6+および3.3+以降利用可能であるように見えます。

すべてのプラットフォームのインターフェースは同じです。

  • send_handle(conn, handle, destination_pid)
  • recv_handle(conn)

どこ:

  • connmultiprocessing.Connection):ファイル記述子を送信する接続
  • handleint):ファイル記述子/ハンドルを参照する整数
  • destination_pidint):ファイル記述子を受信して​​いるプロセスの整数pid-これは現在Windowsでのみ使用されています
于 2019-01-04T22:38:59.523 に答える
0

プロセス間でファイル記述子を共有する方法はありません。方法が存在する場合、それはおそらくOS固有です。

私の推測では、別のレベルでデータを共有する必要があります。

于 2010-06-07T13:20:20.543 に答える