Seite 1 von 1

multiprocessing und join

Verfasst: Freitag 15. Juni 2012, 15:22
von mit
Hi,
Ich habe hier http://www.doughellmann.com/PyMOTW/mult ... ation.html folgendes skript gefunden:

Code: Alles auswählen

import multiprocessing
import time

class Consumer(multiprocessing.Process):
    
    def __init__(self, task_queue, result_queue):
        multiprocessing.Process.__init__(self)
        self.task_queue = task_queue
        self.result_queue = result_queue

    def run(self):
        proc_name = self.name
        while True:
            next_task = self.task_queue.get()
            if next_task is None:
                # Poison pill means shutdown
                print '%s: Exiting' % proc_name
                self.task_queue.task_done()
                break
            print '%s: %s' % (proc_name, next_task)
            answer = next_task()
            self.task_queue.task_done()
            self.result_queue.put(answer)
        return


class Task(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __call__(self):
        time.sleep(0.1) # pretend to take some time to do the work
        return '%s * %s = %s' % (self.a, self.b, self.a * self.b)
    def __str__(self):
        return '%s * %s' % (self.a, self.b)


if __name__ == '__main__':
    # Establish communication queues
    tasks = multiprocessing.JoinableQueue()
    results = multiprocessing.Queue()
    
    # Start consumers
    num_consumers = multiprocessing.cpu_count() * 2
    print 'Creating %d consumers' % num_consumers
    consumers = [ Consumer(tasks, results)
                  for i in xrange(num_consumers) ]
    for w in consumers:
        w.start()
    
    # Enqueue jobs
    num_jobs = 10
    for i in xrange(num_jobs):
        tasks.put(Task(i, i))
    
    # Add a poison pill for each consumer
    for i in xrange(num_consumers):
        tasks.put(None)

    # Wait for all of the tasks to finish
    tasks.join()
    
    # Start printing results
    while num_jobs:
        result = results.get()
        print 'Result:', result
        num_jobs -= 1
Warum hat man nur tasks.join() verwendet und nicht:

Code: Alles auswählen

    for i in xrange(num_consumers + num_jobs):
        tasks.join()
?
Wie beendet man alle consumers und an welcher stelle?

Vielen Dank im voraus.

Re: multiprocessing und join

Verfasst: Freitag 15. Juni 2012, 15:39
von BlackJack
@mit: ``tasks.join()`` wird nur einmal aufgerufen weil es nur einmal nötig ist. Das ist so defniniert dass es auf *alle* Tasks wartet und nicht nur auf einen. Wäre bei der Bedeutung des Wortes „join” IMHO auch komisch wenn es anders wäre.

Die `consumers` werden durch die „Giftpille” beendet beziehungsweise beenden sie sich dadurch selbst.