关于单线程多任务刚开始的理解是有偏差的,并且偏差的很大:以为是在单个线程中实现请求并发;
随后写了段代码测试了一下,发现不是这样的:
代码如下:
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大牛们意见的