2016-01-30 104 views
0

我想了解爲什麼第二個函數沒有被調用,你不能使用while循環與多處理?如果有人有任何建議,將不勝感激!使用While循環的Python多處理?

import multiprocessing 
import time 

from multiprocessing import Pool 

def func_ONE(data): 
    while True: 
     print 'Func ONE' 
     print str(data) 
     time.sleep(10) 

def func_TWO(data): 
    while True: 
     print 'Func TWO' 
     print str(data) 
     time.sleep(10) 

def worker(params): 
    param1, param2 = params 
    if param1: 
     func_ONE(param1) 
    if param2: 
     func_TWO(param2) 

data1 = 'bob' 
data2 = 'joe' 

if __name__ == '__main__': 
    params = zip([data1], [data2]) 
    pool = multiprocessing.Pool() 
    results = pool.map(worker, params) 
+0

對於'multiprocessing.Process'實例(worker)共享的'multiprocessing.Queue()',可能比使用'Pool'更容易(至少對我來說)。但這取決於你想要什麼。爲什麼在func_ONE之後必須有func_TWO?如果'func_ONE'具有'while'而沒有'break',則func_TWO將永遠不會被調用。這與多處理無關。您是否想要使用多個CPU核心同時處理func_ONE和func_TWO,而不是按順序處理? – otterb

+0

我希望能夠通過工作函數傳遞的參數同時運行func_ONE和func_TWO(兩者都循環)。希望是有道理的!謝謝:) – antfuentes87

回答

0
import multiprocessing, Queue, time 

class Worker(multiprocessing.Process): 

    def __init__(self, work_queue): 
     # base class initialization 
     multiprocessing.Process.__init__(self) 

     # job management stuff 
     self.work_queue = work_queue 
     self.kill_received = False 

    def run(self): 

     while not self.kill_received: 

      # get a task 
      try: 
       n_job, data = self.work_queue.get_nowait() 
      except Queue.Empty: 
       break 

      # the actual processing 
      print "Starting %d ..." % n_job 
      print str(data) 
      time.sleep(10) 


if __name__ == "__main__": 

    data1 = 'bob' 
    data2 = 'joe' 

    work_queue = multiprocessing.Queue() 
    for n, data in enumerate([data1, data2]): 
     work_queue.put((n, data)) 

    num_processes = 2 
    for i in range(num_processes): 
     worker = Worker(work_queue) 
     worker.start() 

我猜你想要做的就是這樣的事情。

+0

當我運行這個,while循環不會循環?該程序停止?我需要它永遠循環。另外,我將如何調用不同的功能?在這個例子中,你只有1個函數(運行),但在我的例子中,我有兩個不同的函數。我怎樣才能調用這兩個函數並同時運行它們,並且它們都有自己的while循環。希望是有道理的!謝謝! – antfuentes87

+0

我明白了!這是設計。那麼你可能需要兩個具有不同'def run()'的工人類。而'而不是'而不是'self.kill_received'。 – otterb

+0

有沒有辦法通過work_queue來調用函數?例如,work_queue 1,使用這個函數,然後work_queue 2,使用這個函數?謝謝! – antfuentes87

0

如果你希望你的兩個函數並行運行,你需要讓它們從不同的調用運行到worker而不是同一個。

,而完全不改變你的孩子處理的代碼,你可以做,只是在主過程中的代碼不同的結構化params

params = [(data1, None), (None, data2)] 

但我不知道這是真正做事的最佳方式。如果在作爲參數傳遞給worker,map,map,或許map參數傳遞的2元組中有多個非錯誤值是沒有意義的,那麼使用它是不正確的。您可以改用apply_asyc調用不同的功能在不同的工作進程,如果你想:

if __name__ == '__main__': 
    pool = multiprocessing.Pool() 
    results1 = pool.apply_async(func_ONE, (data1,)) 
    results2 = pool.apply_async(func_TWO, (data2,)) 

現在,你的員工永遠不會返回,因此調用results1.wait()將永遠阻塞的主要過程,這可能並不理想(但這是一個更大的設計問題)。