queue和pipe的區別: pipe用來在兩個進程間通信。queue用來在多個進程間實現通信。 此兩種方法為所有系統多進程通信的基本方法,幾乎所有的語言都支持此兩種方法。
1)Queue & JoinableQueue
queue用來在進程間傳遞消息,任何可以pickle-able的對象都可以在加入到queue。
multiprocessing.JoinableQueue 是 Queue的子類,增加了task_done()和join()方法。
task_done()用來告訴queue一個task完成。一般地在調用get()獲得一個task,在task結束后調用task_done()來通知Queue當前task完成。
join() 阻塞直到queue中的所有的task都被處理(即task_done方法被調用)。
代碼:
代碼如下:
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() # __call__()
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)
新聞熱點
疑難解答