2017-02-21 7 views
0

So habe ich etwas Ähnliches wie diesesPython Multiprocessing eine Reihe von Arbeitern beginnen und andere beginnen, wenn man fertig

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() 

Was ich tun möchte, ist 4 oder mehr „Arbeiter“ starten und verarbeiten die Urls und wenn man endet mit einem anderen. Was wäre der beste Weg, dies zu tun. Ich verbringe zwei Tage damit und finde es nicht heraus.

Vielen Dank Vielen Dank.

+0

Sie sollten einen Prozesspool verwenden. Lesen Sie hier mehr https://docs.python.org/2/library/multiprocessing.html – AndreyF

+0

Können Sie mir ein Beispiel geben, wie man es mit einer Klasse verwendet? – sfantu

+0

https://www.pythonsheets.com/notes/python-concurrency.html - viele Beispiele zur Verwendung als Vorlagen für verschiedene Parallelverarbeitungen einschließlich Multiprocessing – gregory

Antwort

2

Mit 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) 

Siehe concurrent.futures documentation für weitere Einzelheiten.

+0

NameError: Name 'do_something' ist nicht definiert – sfantu

+1

Sie müssen den Code integrieren oben mit deinem. Ich werde meine Antwort aktualisieren. – AJPennster

+0

PicklingError: Kann nicht pickle : Attributsuche __builtin __. Instancemethod failed – sfantu

1

Keine Notwendigkeit, das Rad zu erfinden. ProcessPoolExecutor von concurrent.futures macht genau das, was Sie brauchen.

0

Verwenden Pool von multiprocessing:

Hier ist ein Beispiel kurze Nutzung, die Ihren Zweck auch passen:

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() 
Verwandte Themen