所以,我有一个使用 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 + 多处理做了一些愚蠢的事情,但我真的希望有人可以向我解释我的方法中的缺陷。
提前致谢!