最近想通过twisted实现多线程并发去执行一件耗时的事,然后等这些线程都执行完毕后收集他们的结果做一些事。查了下twisted的文档发现deferredlist正好就是做这中事的。附上例子。。。耗时的事用time.sleep来代替了
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#Author:pako
#Email/gtalk:zealzpc@gmail.com
from twisted.python import threadable
threadable.init(1)
from twisted.internet import threads, reactor,defer
from random import randint
import time
def run():
result=[]
def listCallback(result):
"""
拿到所有线程执行完返回的结果
"""
result=[r[1] for r in result]
print result
print "deferlist result =", result
def doSomeLongTimeThing(sleeptime=0):
"""
每个线程同时做的耗时的事
"""
print sleeptime
time.sleep(sleeptime)
return sleeptime
deferlist=[]
#创建deferlist中的deferred
for i in range(10):
d = threads.deferToThread(doSomeLongTimeThing,sleeptime=randint(3,5))
deferlist.append(d)
#创建deferredlist
dl = defer.DeferredList(deferlist)
#给deferredlist添加回调函数
dl.addBoth(listCallback)
print "1st line after the addition of the callback"
print "2nd line after the addition of the callback"
if __name__ == '__main__':
run()
reactor.run()
分享到:
相关推荐
虽然从理论上能够提高程序的并发能力,但实际上多线程编程较为复杂,需要解决线程间通信等问题。 - 特点:任务在独立的线程中运行,操作系统负责调度。 - 图解说明:通过图表展示了任务如何被分配到不同线程中...
- **多线程模型**:该模型通过创建多个线程同时执行任务,利用多核CPU的优势提高程序的并发能力。 - **特点**:提高了整体的执行效率;但由于线程间的数据共享和通信,导致程序设计变得复杂且难以调试。 - **...
6. **并发处理**:Twisted的并发模型允许在单个线程中处理多个并发任务,减少了线程上下文切换的开销,提高了性能。 7. **测试框架**:Twisted还附带了一个强大的测试框架—— Trial,它支持异步测试,帮助开发者...
在Twisted框架中,主要关注的是事件驱动的非阻塞I/O,它允许程序在等待网络操作完成时执行其他任务,从而提高了资源利用率和程序的响应速度。这一特性使得Twisted特别适合于构建大规模的并发服务器,如聊天服务器、...
3. **并发和并行性**:通过合理使用异步和回调,Twisted可以在单线程中实现高效的并发处理,避免了线程同步带来的复杂性和开销。 4. **测试和调试**:Twisted提供了一些工具,如`trial`测试框架和`twistd`调试...
6. **任务调度**:Twisted的deferToThread和deferToProcess函数可以将耗时操作放入线程或进程执行,以避免阻塞主线程。 三、使用Twisted构建异步应用 1. **定义协议**:根据需求编写自定义协议类,继承自Twisted...
其核心设计基于反应器模式,允许开发者编写非阻塞式的并发代码,从而在单线程环境下处理大量并发连接。 二、异步编程与事件驱动 在Twisted中,程序的执行并不依赖于某个特定的I/O操作完成,而是通过注册回调函数来...
Twisted的核心是它的事件驱动网络引擎,它基于回调函数和反应器设计模式,允许程序在等待网络事件(如连接建立、数据接收等)时执行其他任务,从而实现高效的并发处理。这种非阻塞I/O方式是许多现代服务器实现高并发...
此外,还可以使用`deferToThread`和`callFromThread`进行线程间的通信,以支持多线程环境下的异步操作。 ### 4. 协议和工厂 在Twisted中,`Protocol`类用于定义网络协议的行为,而`Factory`类用于创建协议实例。...
- **多线程与多进程**:支持使用多线程或多进程来处理任务。 #### 二、代码分析 ##### 2.1 导入模块 ```python from twisted.internet import protocol, reactor ``` 这里导入了`protocol`和`reactor`两个核心...
Twisted的核心设计原则之一是采用事件驱动的方式,这使得它能够在单一进程内高效地处理大量的并发连接。 根据提供的文档信息,我们将重点探讨以下几个方面的内容: 1. **Twisted简介** 2. **拒绝连接** 3. **反应...
当 Deferred 的任务完成时,它会按照顺序调用这些回调,传递结果。 2. 错误处理:Deferred还支持错误处理,当异步操作抛出异常时,可以添加errback(错误回调)来处理异常,这有助于构建健壮的异步代码。 3. 异步...
多线程模型允许程序创建多个线程来执行多个任务,而多进程则是创建多个进程。Python有一个著名的特性叫做全局解释器锁(GIL),它限制了同一时刻只有一个线程可以执行Python字节码,这影响了Python在多线程编程上的...
在Python中,线程可以用来并发执行任务,但线程间同步(如使用`threading.Lock`)会增加复杂性,并且在I/O密集型任务中,线程切换的开销可能大于实际工作。而Twisted则通过事件驱动的编程模型,使用回调或协程(例如...
这种模式的优点在于它可以有效地利用单个线程来处理大量的并发I/O请求,从而避免了多线程或多进程带来的开销。 #### 三、Twisted中的Reactor 在Twisted框架中,Reactor扮演着核心的角色。它是整个框架的基础,负责...
如果直接在多线程环境中运行Scrapy,可能会遇到线程安全问题,因为Scrapy和Twisted的事件循环不支持在多个线程中同时运行。然而,我们可以通过一些技巧来解决这个问题。 在提供的代码示例中,定义了一个名为`...
例如,在10K并发连接的情况下,Twisted需要大约55MB的内存,gevent仅需70MB,而使用Python标准库的多线程则高达400MB。这表明gevent在资源管理和性能优化方面有着显著的优势。 五、gevent的使用示例 在gevent中...
- **多线程**:通过创建多个线程并发执行请求,可以显著提高爬虫的速度。 - **异步IO**:使用如asyncio这样的库实现异步编程模型,使得I/O操作不会阻塞主线程。 **分布式爬虫系统设计思路:** - **任务分配**:将...
在IT领域,开发一款桌面聊天工具是常见的任务之一,它涉及到网络编程、多线程处理以及数据序列化等核心概念。本示例着重讲解的是聊天工具的服务端代码,即"TCP_Server",它负责监听客户端的连接请求,接收并发送数据...