私はこれをスレッドで行い、a queueを使用してジョブ管理を処理しました。ここにベースラインがあります。私の完全なバージョンはtry-catches
の束を持っています(特に失敗時にq.task_done()
が呼び出されていることを確認するために、特にワーカーで)。
from threading import Thread
from queue import Queue
import time
import random
def run(idx, *args):
time.sleep(random.random() * 1)
print idx, ':', args
def run_jobs(jobs, workers=1):
q = Queue()
def worker(idx):
while True:
args = q.get()
run(idx, *args)
q.task_done()
for job in jobs:
q.put(job)
for i in range(0, workers):
t = Thread(target=worker, args=[i])
t.daemon = True
t.start()
q.join()
if __name__ == "__main__":
run_jobs([('job', i) for i in range(0,10)], workers=5)
私は(私の労働者が、単に外部プロセスを呼び出すためのものである)マルチプロセッシングを使用する必要はありませんでしたが、これは拡張することができます。マルチプロセッシングのためのAPIがそれにタッチを変更し、ここにあなたが適応することができる方法です:
from multiprocessing import Process, Queue
from Queue import Empty
import time
import random
def run(idx, *args):
time.sleep(random.random() * i)
print idx, ':', args
def run_jobs(jobs, workers=1):
q = Queue()
def worker(idx):
try:
while True:
args = q.get(timeout=1)
run(idx, *args)
except Empty:
return
for job in jobs:
q.put(job)
processes = []
for i in range(0, workers):
p = Process(target=worker, args=[i])
p.daemon = True
p.start()
processes.append(p)
for p in processes:
p.join()
if __name__ == "__main__":
run_jobs([('job', i) for i in range(0,10)], workers=5)
どちらのバージョンが出力何かを好きになるでしょう:
0 : ('job', 0)
1 : ('job', 2)
1 : ('job', 6)
3 : ('job', 3)
0 : ('job', 5)
1 : ('job', 7)
2 : ('job', 1)
4 : ('job', 4)
3 : ('job', 8)
0 : ('job', 9)
UUIDのようなランダムなものを使用しないのはなぜ? –
@ LuperRouch - あなたはそれが意味するものを拡大できますか? – JoshAdel
例えば '' process = Process(target = foo、name = uuid.uuid4()。hex) ''はプロセスに一意の名前を与えます。 –