簡體   English   中英

扭曲的deferToThread TCP連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM