所以我有类似的东西
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个或更多“工人”启动并处理网址,当一个人完成另一个工作时。 什么是最好的方法来做到这一点。我花了两天时间来解决这个问题。
谢谢 谢谢。
答案 0 :(得分:2)
使用concurrent.futures
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)
有关详细信息,请参阅concurrent.futures documentation。
答案 1 :(得分:1)
无需发明轮子。来自concurrent.futures的ProcessPoolExecutor
完全符合您的需要。
答案 2 :(得分:0)
使用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()