Pool.map
の使い方はありませんが、大量の入力ではPool.map
は機能しません。 Python 3.6では、Lib/multiprocessing/pool.pyに実装されています。iterable
が最初の引数として指定されていますが、実装ではマルチプロセスマップを実行する前にconsume the whole iterableになります。だから、多くのデータを処理する必要がある場合は、使用する必要があるのはPool.map
ではないと思います。たぶんPool.imap
とPool.imap_unordered
が動作する可能性があります。
実際の問題について私はPool.map
を含まない解決策を持っていて、マルチプロセスのようなものを扱っていますforeach
。 queue
経由
queue = Queue()
workers = list()
for _ in range(cpu_count()): # minus one if the main processus is CPU intensive
worker = Worker(queue)
workers.append(worker)
worker.start()
は、その後、あなたがプールを養うことができます:あなたはそのようなprocessusのプールを用意
from multiprocessing import cpu_count
from multiprocessing import Queue
from multiprocessing import Process
class Worker(Process):
english = spacy.load('en')
def __init__(self, queue):
super(Worker, self).__init__()
self.queue = queue
def run(self):
for args in iter(self.queue.get, None):
# process args here, you can use self.
:
まずあなたがPool
を継承し、ワーカープロセスを作成する必要があり
for args in iterable:
queue.put(args)
iterable
はargのリストですあなたが労働者に渡す痕跡。上記のコードは可能な限り速くiterable
の内容をプッシュします。基本的には、作業者の速度が十分に遅い場合、作業者が作業を完了する前に、ほぼすべての反復可能命令がキューにプッシュされます。だから、の内容は、のメモリに収まる必要があります。
労働者の引数(別名iterable
が。)あなたが何とかメインprocessusと労働者を同期する必要がありますメモリに収まらない場合は...終わり
は以下を呼び出してください:
for worker in workers:
queue.put(None)
for worker in workers:
worker.join()
どのバージョンのPythonを使用していますか? – amirouche
3.5.2、Ubuntuで16.04 – tombird
私の答えはどう思いますか? – amirouche