`
wwty
  • 浏览: 536725 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

twisted单线程多任务

阅读更多

关于单线程多任务刚开始的理解是有偏差的,并且偏差的很大:以为是在单个线程中实现请求并发;

 

随后写了段代码测试了一下,发现不是这样的:

代码如下:

 

from twisted.internet import protocol, reactor, defer
import dbconsolethread,time

PORT = 5001

class SMGServProtocol(protocol.Protocol):
    def connectionMade(self):
        print 'client connected port:',self.transport.getPeer().host
    
    def dataReceived(self, data):
        try:
            if data:
                print 'data:',data
                defer = self.factory.dataConsole(data)
                defer.addErrback(self.transport.loseConnection())
                defer.addCallback(self.repConsole(returndata))
        except:
            self.transport.loseConnection()
            
    def repConsole(self,returndata):
        print 'returndata:',returndata
       
    def connectionLost(self, reason):
        print 'client connected lost'
        print reason

class SMGServFactory(protocol.ServerFactory):
    protocol = SMGServProtocol
    def __init__(self):
        self.dbcontrol = dbconsolethread.DBcontral()
    
    def dataConsole (self, data):
        return defer.succeed(self.loadData())
    
    def loadData(self):
        time.sleep(3)
        return 'sleep over'
    
if __name__ == '__main__':
    reactor.listenTCP(PORT, SMGServFactory())
    reactor.run()
 然后在cmd下向服务器端请求,发现是一次只能处理一个,只有第一个处理完毕,程序才会接收第二个请求;

 

而我原来的认为是:程序最起码能够接收第二次发送的请求数据,接收之后才进入等待第一个请求处理完毕的时间

 

测试之后的结果是:对于第一次请求没有处理完成前提下的第二个请求,程序是根本不接收的。只有等到第一个请求处理完毕

才会接收下面的请求数据。

 

而所谓的并发,也只是在定义了 defer.addCallback(self.repConsole(returndata))方法之后,调用

reactor.callback方法才会同时指定多长时间之后调用,才会进入并发执行状态

 

那么所谓的单线程多任务是什么意思呢?

首先得明白,是单线程,那么从计算机本身的原理来讲,在单个线程中,是不可能实现并发的,那么就可以总结为,单线程中的多任务是纵向的多任务

而不是横向的。

在一个线程中,纵向执行多个任务。而如果想让某个任务并发执行,那么是可以利用reactor去实现并发的;前提是定义了defer的addcallback方法

 

提示:以上是鄙人的学习总结,如有错误之处,还望各位勘正,本文之所以进入论坛,也是为了听取python大牛们意见的

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics