84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
认证高级PHP讲师
Twisted的IO操作是单线程的,即reactor线程。然而IO操作并不是消耗CPU性能的瓶颈所在,真正需要消耗CPU性能实际上是业务逻辑。Twisted提供了reactor.callInThread函数,可以让耗时的业务逻辑放到新的业务线程池中执行,而不是在reactor线程中运行,这样可以充分利用多核。
# -*- coding:utf-8 –*- import time from twisted.internet.protocol import Protocol from twisted.internet.protocol import Factory from twisted.internet import reactor # 耗时、阻塞的业务逻辑 def logic(data): print data time.sleep(3) # 假设这里有个变态的业务逻辑要执行3秒 class TcpServerHandle(Protocol): def dataReceived(self, data): reactor.callInThread(logic, data) # 在线程池中运行logic(data)耗时任务,不在reactor线程中运行 reactor.suggestThreadPoolSize(8) # 设置线程池的线程数量为8 factory = Factory() factory.protocol = TcpServerHandle reactor.listenTCP(8080, factory) reactor.run()
可以参考我写的一篇关于Twisted线程模型的博文:http://xxgblog.com/2014/10/16/mina-netty-twisted-10/
python(这里特指CPython)本身就不适用于CPU敏感型的开发,跑多核无力,twisted只是一个python的类库,低层也是select、epoll那些东西,如果你这里的用多核指的是spawn出多个process跑CPU那也算是一种多核,但这个不是广义上的支持多核。广义上支持多核的语言有erlang(天生面向并发), golang(调度器自己多调度), C++(需要设置线程的CPU亲和性), JVM语言如java/scala/clojue由JVM做调度。twisted的性能比libevent的要低
Twisted的IO操作是单线程的,即reactor线程。然而IO操作并不是消耗CPU性能的瓶颈所在,真正需要消耗CPU性能实际上是业务逻辑。Twisted提供了reactor.callInThread函数,可以让耗时的业务逻辑放到新的业务线程池中执行,而不是在reactor线程中运行,这样可以充分利用多核。
可以参考我写的一篇关于Twisted线程模型的博文:http://xxgblog.com/2014/10/16/mina-netty-twisted-10/
python(这里特指CPython)本身就不适用于CPU敏感型的开发,跑多核无力,twisted只是一个python的类库,低层也是select、epoll那些东西,如果你这里的用多核指的是spawn出多个process跑CPU那也算是一种多核,但这个不是广义上的支持多核。
广义上支持多核的语言有erlang(天生面向并发), golang(调度器自己多调度), C++(需要设置线程的CPU亲和性), JVM语言如java/scala/clojue由JVM做调度。
twisted的性能比libevent的要低