[英]Python Multiprocessing - Possible to start the workers at slightly different starting time?
[英]Python multiprocessing start a number of workers and start others when one finishes
所以我有類似的東西
import multiprocessing
class MyFancyClass(object):
def __init__(self, name):
self.name = name
def do_something(self):
proc_name = multiprocessing.current_process().name
print 'Doing something fancy in %s for %s!' % (proc_name, self.name)
def worker(q):
obj = q.get()
obj.do_something()
if __name__ == '__main__':
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.python.org/community/awards/'
# etc..
]
queue = multiprocessing.Queue()
p = multiprocessing.Process(target=worker, args=(queue,))
p.start()
queue.put(MyFancyClass('Fancy Dan'))
# Wait for the worker to finish
queue.close()
queue.join_thread()
p.join()
我想要做的是讓4個或更多“工人”啟動並處理網址,當一個完成時啟動另一個。 什么是做到這一點的最佳方法。 我花了兩天時間,無法解決。
謝謝謝謝。
使用並發
import concurrent.futures
import multiprocessing
def do_something(name):
proc_name = multiprocessing.current_process().name
print 'Doing something fancy in %s for %s!' % (proc_name, name)
class MyFancyClass(object):
def __init__(self, name):
self.name = name
MyFancy = MyFancyClass("Name")
if __name__ == '__main__':
urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.python.org/community/awards/'
# etc..
]
with concurrent.futures.ProcessPoolExecutor() as executor:
results = executor.map(do_something, urls)
有關詳細信息,請參見current.futures文檔 。
無需發明輪子。 ProcessPoolExecutor
從concurrent.futures不正是你所需要的。
使用multiprocessing
Pool
:
這是一個簡短的示例,它可能適合您的目的:
from multiprocessing import Pool
def f(x,y):
print x*y
p = Pool(5)
for i in range(100):
p.apply_async(f,(i,i+1))
p.close()
p.join()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.