Twisted 使用多线程
Twisted 提供主线程和辅线程,主线程只有1个,即reactor.run(),辅线程有多个,可以自由配置
Twisted 大多数代码运行在主线程中,dataReceived(),connectionLose()等事件处理函数由主线程调用,如果耗时太长,可以将其移到辅助线程中处理
同时,Twisted框架中大多数内置函数都不是线程安全的,因此需要将内置函数放入主线程中,否则会导致逻辑错误或者系统崩溃
1、使代码运行在主线程中
如果其他线程中需要执行非线程安全的Twisted内置函数,可以使用reactor.callFromThread()函数使代码运行在主线程中
from twisted.internet import reactor,defer import Myprotocol protocol = Myprotocol() def must_run_in_main_thread(message): protocol.send = True protocol.transport.write(message) def run_in_any_thread(): reactor.callFromThread(must_run_in_main_thread,'good') print('the run of must_run_in_main_thread has been finashed')
callFromThread将自己的线程在调用处挂起。直到被调用的函数已经在主线程中完成
注:callFromThread不仅可以是twisted的辅助线程,还可以是twisted主线程,或是python threading库建立的线程
2、在辅助线程中运行
在主线程中遇到比较耗时的处理时,可以用reactor.callInThread()函数建立辅助线程任务
from twisted.internet import reactor,defer from twisted.internet.protocol import DatagramProtocol def long_operation(msg): import time time.sleep(10) print('10秒后获取信息',msg) class Echo(DatagramProtocol): def datagramReceived(self, datagram, addr): # 调用long_operation,在辅助线程中执行,本调用在主线程中立即返回 reactor.callInThread(long_operation,datagram.decode('utf8')) protocol = Echo() reactor.listenUDP(8007,protocol) reactor.run()
3、配置线程池
可以使用reactor.suggestThreadPoolsize(10),定义线程数量