2017-02-21 24 views
0

所以我也有类似的这种Python的多重启动一批工人,并开始别人当一个完成

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个或更多的“工人”是什么东西启动和处理的URL,当一个完成开始另一个。 什么是最好的方式来做到这一点。我花了两天时间,无法弄清楚。

谢谢 谢谢。

+0

您应该使用进程池。在这里阅读更多 https://docs.python.org/2/library/multiprocessing.html – AndreyF

+0

你能给我一个如何与类一起使用的例子吗? – sfantu

+0

https://www.pythonsheets.com/notes/python-concurrency.html - 用于作为包括多处理在内的各种并行处理的模板的范例程序 – gregory

回答

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了解详情。

+0

NameError:名称'do_something'未定义 – sfantu

+1

您需要集成代码与你的上面。我会更新我的答案。 – AJPennster

+0

PicklingError:不能pickle :属性查找__builtin __。instancemethod失败 – sfantu

1

无需发明车轮。 ProcessPoolExecutorconcurrent.futures完全符合您的需求。

0

使用Poolmultiprocessing

下面是可能适合你的目的很短的使用例子:

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() 
相关问题