2016-01-20 79 views
0

我新的扭曲,試圖寫我的第一個應用程序,我居然堅持了這個問題:扭曲deferToThread TCP連接

我有一個加載了一堆模塊運行的主線程,放入系統中的每一個模塊位於遠程服務器,並可以通過一個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分開的線程上?

主應用程序將每天處理數百萬個請求,所以它應該是完全不阻塞的。

這是處理這個問題的正確方法嗎?有人能指出我如何實現這一目標的正確方向嗎?

回答

0

Twisted的事件循環API不是線程安全的,如Twisted's threading documentation所涵蓋。這意味着您絕對不能撥打deferToThread來處理連接;如果你嘗試過,它會崩潰。

等待的TCP連接不會導致事件循環卡住;用於向連接發送和接收數據的API已經是非阻塞的。所以我認爲你在這裏沒有問題要解決,它已經爲你解決了。

+0

非常感謝你;) – kitensei