[英]twisted deferToThread tcp connections
我是新手,嘗試編寫我的第一個應用程序,但實際上我陷入了這個問題:
我有一個主線程,該線程加載一堆要運行的模塊,這些模塊中的每個模塊都位於遠程服務器上,並且可以通過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
的單獨線程上嗎?
主應用程序每天將處理數百萬個請求,因此應完全無阻塞。
這是正確的處理方式嗎? 有人可以指出我如何實現此目標的正確方向嗎?
Twisted的事件循環API並非線程安全的,如Twisted的線程文檔所述 。 這意味着您絕對不能調用deferToThread
來處理連接。 如果嘗試,它將崩潰。
等待TCP連接不會導致事件循環陷入困境; 用於發送和接收數據到連接的API已經是非阻塞的。 因此,我認為您沒有要解決的問題,已經為您解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.