2012-02-03 16 views
1

這是我想要做的僞代碼。從一個進程異步檢索信息

import time 

def run(): 

    while x < 10000000: 
     x += 1 

if __name__ == "__main__": 

    p = Process(run) 
    p.start() 

    time.sleep(3) 

    #some code that I don't know that will give me the current value of x 

蟒蛇threading模塊似乎但是去我還沒有成功地實現這個例子的方式。

回答

0

您需要的全部是multiprocessingmodule。也許shared memory對象在這裏會有所幫助?

請注意,Python中的線程受Global Interpreter Lock影響,這基本上阻止了多線程Python代碼。

+0

您能否提供一個示例,並且可以在沒有共享內存的情況下執行此操作?此外,我的意思是多處理模塊,只是將它分開並寫入線程代替= P。 – John 2012-02-04 00:53:24

+0

我也是第一次這樣做。您是否嘗試過文檔中的示例? - 如果沒有共享內存,你需要以某種方式主動交流'x'的值。 – krlmlr 2012-02-04 00:58:34

0

那麼這裏是

from multiprocessing import Process, Pipe 
import time 

def f(conn): 
    x = 0 
    while x < 10000000: 
     if conn.poll(): 
      if conn.recv() == "get": 
       conn.send(x) 

     x += 1 

    conn.close() 

if __name__ == '__main__': 

    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 

    time.sleep(2) 
    parent_conn.send("get") 
    print(parent_conn.recv()) 

    p.join() 

竟然是一個duplicate,我的版本僅僅是更通用。

0

這實際上取決於你想要完成什麼以及你的子過程的創建和內存使用的頻率。一些長壽命的,並且您可以輕鬆脫離多個OS級別的進程(請參閱subprocess模塊)。如果你產生了很多小的代碼,線程速度更快,內存開銷更少。但是通過線程,你會遇到諸如「線程安全」,全局解釋器鎖,以及討厭的,像信號量和死鎖這樣的無聊東西。兩個進程或線程之間

數據共享策略可以粗略地分爲兩類:「讓我們共享的存儲器中的塊」(使用Lock S和Mutex ES)和「讓我們共享數據的拷貝」(使用消息傳遞,管道,或socket s)。共享方法在內存上很輕,但很難管理,因爲這意味着確保一個線程不會像另一個線程寫入共享內存那樣讀取共享內存的相同部分,這不是微不足道的,也很難調試。複製方法在內存上較重,但容易理解。此外,它具有明顯的優勢,可以非常簡單地移植到網絡,從而實現分佈式計算。

你還必須考慮底層操作系統。我不知道具體情況,但有些方法比其他方法更好。

我想說從RabbitMQ開始。