我对twisted是个新手,试图编写我的第一个应用程序,但实际上我遇到了这个问题:
我有一个主线程,它加载一堆要运行的模块,这些模块中的每一个都位于远程服务器上,并通过tcp连接可用,下面是模块运行代码的样子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import struct
from twisted.internet import endpoints
from twisted.internet.defer import inlineCallbacks
from twisted.spread import pb
from txapp.core import get_modules
from txmod.spread import EnvelopeSpreadReceiver
@inlineCallbacks
def listen(reactor):
modules = yield get_modules()
for mod in modules:
endpoint = endpoints.serverFromString(reactor, 'tcp:%d:%s' %
(int(mod.get('module_server_port') or 0),
socket.inet_ntoa(struct.pack('!L', mod.get('module_server_ipaddr'))),))
endpoint.listen(pb.PBServerFactory(EnvelopeSpreadReceiver()))
print 'PBServerFactory starting on %s:%d for module %s' % (
socket.inet_ntoa(struct.pack('!L', mod.get('module_server_ipaddr'))),
int(mod.get('module_server_port')),
mod.get('module_name'))
def main():
from twisted.internet import reactor
listen(reactor)
reactor.run()
if __name__ == "__main__":
main()
给定的服务器
也许
在不同的端口上运行多个模块,但通常是:
1台服务器,1个模块
运行应用程序的主服务器将尝试连接到每个模块,运行代码并期待结果(成功与否)。
我正在纠结如何使此代码不阻塞:如果服务器无法响应,tcp连接可能会挂起,所以我应该将每个模块tcp连接放在一个单独的线程上
deferToThread
?
主应用程序每天将处理数百万个请求,因此它应该是完全无阻塞的。
这是正确的处理方法吗?有人能给我指出如何实现这一目标的正确方向吗?