`
wwty
  • 浏览: 543014 次
  • 性别: 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大牛们意见的

分享到:
评论

相关推荐

    Twisted与异步编程入门

    异步编程的优势在于,它可以在单线程环境中实现任务的并发执行,无需等待某个任务完成即可开始另一个,提高了系统的响应性和资源利用率。然而,这也意味着程序员需要处理更多的回调函数和事件驱动逻辑,增加了代码的...

    twisted适合python3.8版本

    6. **并发处理**:Twisted的并发模型允许在单个线程中处理多个并发任务,减少了线程上下文切换的开销,提高了性能。 7. **测试框架**:Twisted还附带了一个强大的测试框架—— Trial,它支持异步测试,帮助开发者...

    中文Twisted入门教程

    - **单线程同步模型**:这是最基础的编程模型,其中任务依次执行,一个任务完成后另一个任务才开始。这种方式在处理CPU密集型任务时有效,但在处理I/O密集型任务时效率低下。 - **特点**:简单直观、易于理解和...

    twisted例子

    9. **进程与线程管理**:Twisted还支持跨进程和线程的通信,可能有相关的示例说明如何利用这些功能。 通过深入研究"twisted-intro-master"中的示例,开发者可以逐步理解并熟练运用Twisted框架,从而开发出高效、...

    Twisted与异步编程入门(汇总版)

    3. **并发和并行性**:通过合理使用异步和回调,Twisted可以在单线程中实现高效的并发处理,避免了线程同步带来的复杂性和开销。 4. **测试和调试**:Twisted提供了一些工具,如`trial`测试框架和`twistd`调试...

    python twisted系列

    6. **任务调度**:Twisted的deferToThread和deferToProcess函数可以将耗时操作放入线程或进程执行,以避免阻塞主线程。 三、使用Twisted构建异步应用 1. **定义协议**:根据需求编写自定义协议类,继承自Twisted...

    python_twisted基础教程

    单线程异步模式可以保证程序运行在一个线程中,即使在一个多进程系统中。 为什么采用异步模型? 异步模型可以和多线程模型结合起来,但是在这个系列教程中,我们只涉及到异步模型。异步模型比多线程模型更简单些,...

    基于gevent开发的模拟twisted的轻型的异步网络框架.rar

    单线程同步模型,任务按照顺序执行.如果某个任务因为IO阻塞,其他所有的任务都必须等待,直到完成才能执行,但如果任务之间没有相互等待的话,就使得程序不必要的降低了运行速度. 2.多线程,线程是由操作系统来管理的,在多...

    剖析Python的Twisted框架的核心特性

    3. 非阻塞操作:reactor回调的处理器应该尽可能快地完成任务,避免阻塞,因为reactor是单线程的,如果处理器阻塞,整个事件循环会被阻塞,影响其他事件的处理。 4. 显式停止:通过调用`reactor.stop()`来停止reactor...

    Python的Twisted框架上手前所必须了解的异步编程思想

    异步编程模型(图3)采用单线程执行任务,任务之间通过回调函数或者事件循环协调。即使有I/O操作,程序也不会阻塞,而是继续执行其他任务,当I/O操作完成时,通过事件通知恢复执行。异步编程简化了线程管理,但增加...

    The Twisted Documentation

    - **简单的单用途客户端**:Twisted 提供了简单的方法来创建单用途客户端,例如使用 `reactor.connectTCP` 连接到远程服务器。 - **高级示例**:更复杂的客户端可能需要使用 `ClientFactory` 类来管理连接状态,以及...

    C++多线程编程介绍,技巧及注意要点-Part_3.pptx

    在本节中,我们将深入探讨异步编程,这是多线程编程的一个重要方面,它可以帮助我们有效处理I/O密集型任务,避免阻塞,提升系统资源利用率。 首先,我们需要理解为什么需要异步编程。传统的阻塞I/O模型在处理大量...

    Python实现在线程里运行scrapy的方法

    本篇文章将探讨如何在Python线程中运行Scrapy爬虫,以便实现多任务并行,提高工作效率。 首先,我们要知道Scrapy是基于Twisted异步网络库构建的,它默认在单个进程中运行。如果直接在多线程环境中运行Scrapy,可能...

    twested:自动化 Web 浏览器操作 Twisted 样式

    7. **多线程与并发**:虽然 Twisted 自身已经提供了异步处理,但在处理大量并发任务时,可能还需要用到多线程或多进程,以充分利用系统资源。 在 "twsted-master" 压缩包中,通常会包含以下内容: - `README.md`:...

    Python高性能网络编程并发框架研究.zip

    多线程允许在一个进程内同时执行多个任务,但受制于全局解释器锁(GIL),在CPU密集型任务中性能受限。多进程则通过创建独立的进程来避免GIL的影响,适合于CPU密集型任务。而异步I/O模型,如事件驱动编程或回调函数...

    理解Python异步中的事件循环(asyncio管理事件循环)

    单线程、异步阻塞 异步的实现基于协程,不仅使得Python中的异步是阻塞的,而且最小执行单位不再是单个任务,而是每个任务的一部分。 Python高并发方案的区别 多进程、多线程这类方案,IO的调度取决于系统; 协程,...

    扭曲:用Python编写的事件驱动网络引擎

    3. **异步Python (async Python)**:Twisted的异步编程模型是基于协程的,允许在单个线程中并发执行多个任务。这使得开发者可以编写出更简洁、易于理解和维护的代码,而不是依赖多线程或进程。 4. **Twisted Matrix...

Global site tag (gtag.js) - Google Analytics