2012-03-03 116 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()