我有一个应用程序,它使用Twisted + Stomper作为STOMP客户端,并将工作分配给multiprocessing.Pool的工作者。
当我使用python脚本启动时,这似乎可以正常工作,简化后的脚本如下:
# stompclient.py
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
reactor.connectTCP(host, port, StompClientFactory())
reactor.run()
随着部署的打包,我想利用twistd脚本,并从tac文件中运行它。
这是我非常相似的tac文件:
# stompclient.tac
logging.config.fileConfig(config_path)
logger = logging.getLogger(__name__)
# Add observer to make Twisted log via python
twisted.python.log.PythonLoggingObserver().start()
# initialize the process pool. (child processes get forked off immediately)
pool = multiprocessing.Pool(processes=processes)
StompClientFactory.username = username
StompClientFactory.password = password
StompClientFactory.destination = destination
application = service.Application('myapp')
service = internet.TCPClient(host, port, StompClientFactory())
service.setServiceParent(application)
为了举例说明,我已经折叠或更改了一些细节;希望它们不是问题的本质。例如,我的应用程序有一个插件系统,池由单独的方法初始化,然后使用pool.apply_async()将工作委托给池,传递我的插件的process()方法之一。
所以,如果我运行脚本(stompclient.py),一切都按预期工作。
如果我在非守护进程模式下(-n)运行twist,它似乎也可以正常工作:
twistd -noy stompclient.tac
然而,当我以守护进程模式运行时,它并不起作用:
twistd -oy stompclient.tac
应用程序似乎启动正常,但当它尝试分叉工作时,它就会卡住。所谓的“卡住”,是指子进程似乎从未被要求做任何事情,而调用pool.apply_async()的父进程只是坐在那里等待响应返回。
我确定我在使用Twisted + multiprocessing方面做了一些愚蠢的事情,但我真的希望有人能解释一下我的方法中的缺陷。
提前感谢!