2016-01-21 106 views
2

我正在努力讓我的頭多處理,並傳遞一個全局真/假變量到我的函數。多處理和全局真/假變量

get_data()完成後,我希望分析()函數啓動並處理數據,而fetch()繼續運行。我該如何做這項工作? TIA

import multiprocessing 

ready = False 


def fetch(): 
    global ready 
    get_data() 
    ready = True 
    return 


def analysis(): 
    analyse_data() 

if __name__ == '__main__': 
    p1 = multiprocessing.Process(target=fetch) 
    p2 = multiprocessing.Process(target=analysis) 
    p1.start() 
    if ready: 
     p2.start() 

回答

1

您應該運行這兩個進程並使用共享隊列在它們之間交換信息,例如在其中一個進程中指示完成某個操作。

此外,您需要有一個join()語句來正確等待您生成的進程的完成。

from multiprocessing import Process, Queue 
import time 

def get_data(q): 
    #Do something to get data 
    time.sleep(2) 
    #Put an event in the queue to signal that get_data has finished 
    q.put('message from get_data to analyse_data') 

def analyse_data(q): 
    #waiting for get_data to finish... 
    msg = q.get() 
    print msg #Will print 'message from get_data to analyse_data' 
    #get_data has finished 

if __name__ == '__main__': 
    #Create queue for exchanging messages between processes 
    q = Queue() 
    #Create processes, and send the shared queue to them 
    processes = [Process(target=get_data,args(q,)),Process(target=analyse_data,args=(q,))] 
    #Start processes 
    for p in processes: 
    p.start() 
    #Wait until all processes complete 
    for p in processes: 
    p.join() 
0

例如,您不會有幾個原因的工作:

  • 過程不能互相分享這塊內存(你不能改變全局的一個過程,看到了變化在其他)
  • 即使你可以改變全局值,則檢查得太快了,最有可能的時間

https://docs.python.org/3/library/ipc.html爲FO更多的可能性,它不會改變r進程間通信