关于单线程多任务刚开始的理解是有偏差的,并且偏差的很大:以为是在单个线程中实现请求并发;
随后写了段代码测试了一下,发现不是这样的:
代码如下:
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大牛们意见的
分享到:
相关推荐
异步编程的优势在于,它可以在单线程环境中实现任务的并发执行,无需等待某个任务完成即可开始另一个,提高了系统的响应性和资源利用率。然而,这也意味着程序员需要处理更多的回调函数和事件驱动逻辑,增加了代码的...
6. **并发处理**:Twisted的并发模型允许在单个线程中处理多个并发任务,减少了线程上下文切换的开销,提高了性能。 7. **测试框架**:Twisted还附带了一个强大的测试框架—— Trial,它支持异步测试,帮助开发者...
- **单线程同步模型**:这是最基础的编程模型,其中任务依次执行,一个任务完成后另一个任务才开始。这种方式在处理CPU密集型任务时有效,但在处理I/O密集型任务时效率低下。 - **特点**:简单直观、易于理解和...
9. **进程与线程管理**:Twisted还支持跨进程和线程的通信,可能有相关的示例说明如何利用这些功能。 通过深入研究"twisted-intro-master"中的示例,开发者可以逐步理解并熟练运用Twisted框架,从而开发出高效、...
3. **并发和并行性**:通过合理使用异步和回调,Twisted可以在单线程中实现高效的并发处理,避免了线程同步带来的复杂性和开销。 4. **测试和调试**:Twisted提供了一些工具,如`trial`测试框架和`twistd`调试...
6. **任务调度**:Twisted的deferToThread和deferToProcess函数可以将耗时操作放入线程或进程执行,以避免阻塞主线程。 三、使用Twisted构建异步应用 1. **定义协议**:根据需求编写自定义协议类,继承自Twisted...
单线程异步模式可以保证程序运行在一个线程中,即使在一个多进程系统中。 为什么采用异步模型? 异步模型可以和多线程模型结合起来,但是在这个系列教程中,我们只涉及到异步模型。异步模型比多线程模型更简单些,...
单线程同步模型,任务按照顺序执行.如果某个任务因为IO阻塞,其他所有的任务都必须等待,直到完成才能执行,但如果任务之间没有相互等待的话,就使得程序不必要的降低了运行速度. 2.多线程,线程是由操作系统来管理的,在多...
3. 非阻塞操作:reactor回调的处理器应该尽可能快地完成任务,避免阻塞,因为reactor是单线程的,如果处理器阻塞,整个事件循环会被阻塞,影响其他事件的处理。 4. 显式停止:通过调用`reactor.stop()`来停止reactor...
异步编程模型(图3)采用单线程执行任务,任务之间通过回调函数或者事件循环协调。即使有I/O操作,程序也不会阻塞,而是继续执行其他任务,当I/O操作完成时,通过事件通知恢复执行。异步编程简化了线程管理,但增加...
- **简单的单用途客户端**:Twisted 提供了简单的方法来创建单用途客户端,例如使用 `reactor.connectTCP` 连接到远程服务器。 - **高级示例**:更复杂的客户端可能需要使用 `ClientFactory` 类来管理连接状态,以及...
在本节中,我们将深入探讨异步编程,这是多线程编程的一个重要方面,它可以帮助我们有效处理I/O密集型任务,避免阻塞,提升系统资源利用率。 首先,我们需要理解为什么需要异步编程。传统的阻塞I/O模型在处理大量...
本篇文章将探讨如何在Python线程中运行Scrapy爬虫,以便实现多任务并行,提高工作效率。 首先,我们要知道Scrapy是基于Twisted异步网络库构建的,它默认在单个进程中运行。如果直接在多线程环境中运行Scrapy,可能...
7. **多线程与并发**:虽然 Twisted 自身已经提供了异步处理,但在处理大量并发任务时,可能还需要用到多线程或多进程,以充分利用系统资源。 在 "twsted-master" 压缩包中,通常会包含以下内容: - `README.md`:...
多线程允许在一个进程内同时执行多个任务,但受制于全局解释器锁(GIL),在CPU密集型任务中性能受限。多进程则通过创建独立的进程来避免GIL的影响,适合于CPU密集型任务。而异步I/O模型,如事件驱动编程或回调函数...
单线程、异步阻塞 异步的实现基于协程,不仅使得Python中的异步是阻塞的,而且最小执行单位不再是单个任务,而是每个任务的一部分。 Python高并发方案的区别 多进程、多线程这类方案,IO的调度取决于系统; 协程,...
3. **异步Python (async Python)**:Twisted的异步编程模型是基于协程的,允许在单个线程中并发执行多个任务。这使得开发者可以编写出更简洁、易于理解和维护的代码,而不是依赖多线程或进程。 4. **Twisted Matrix...