2012-03-03 72 views
1

處理這個問題可能是不清楚 - 如果是這樣,那可能是因爲我不完全舒爾怎麼問這樣的問題 - 但這裏有雲:的Python:發送消息從內部類

我有一個Python類我想調用一個函數。

的類沒有訪問該功能應該操作的數據 - 基本上,我想這個類將消息發送到另一個進程,調用該函數。喜歡的東西:

from multiprocessing import Process 

class Foo(): 
    def bar(phonenumber): 
     do_something() 
     send_message(phonenumber) 

def daemon(data, phonenumber): 
    while nothing_receivied(phonenumber): 
     do_nothin() 
     also_do_not_consume_too_much_CPU() 
    if message_received(phonenumber): 
     function(data) 

p = Process(target=daemon, args=(data, phonenumber)) 
p.start() 
p.join() 

調用然後Foo.bar(phonenumber)應該有functiondata執行額外的效果 - 這是怎麼實現的?

乾杯!

+1

請參閱消息隊列(和典型的MQ模式),如青苗或ZeroMQ(和許多其他人),看看他們是否符合你的使用情況 – aitchnyu 2012-03-03 17:00:53

+0

ZeroMQ的+1。我完全忘記在我的答案中提到消息隊列。 – jdi 2012-03-03 17:03:15

回答

0

如果你明確要使用的multiprocessing模塊,你應該看看到使用的隊列/管道。 http://docs.python.org/library/multiprocessing.html#pipes-and-queues

,你要坐下來,什麼也不做,而不會佔用過多CPU的守護進程的代碼部分的地步,它會嘗試從隊列中獲得一個項目,或輪詢數據和塊,直到事情管準備好了。隊列或管道的另一端只是將數據放入隊列中,填充您的概念角色。

如果你想有一個更強大的異步解決方案,您也應該檢查出的扭曲庫:http://twistedmatrix.com/trac/

這將允許你在有一個事件循環使用處理程序來處理傳入的連接定義級別較高的服務。最後,如果您只想在同一個腳本中使用簡單的解決方案,而不是基於網絡的任何內容,則可以輕鬆使用線程模塊:http://docs.python.org/library/threading.html。而使用Queue.Queue的守護與get()阻止,並send_message()做了put()