- 浏览: 664608 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sztime:
可以在文本框上绑定事件来禁用回车键, 我就是这样做的.在IE中 ...
form 回车自动提交问题 -
damoqiongqiu:
非常好的文章,很透彻不过有一句话小僧腆着脸补充一下:“1111 ...
为什么要用补码来做存储 -
wuyizhong:
原来如此啊。
form 回车自动提交问题 -
luliangy:
谢楼主~!
用C语言扩展Python的功能 -
kwong:
很有用,谢谢
火狐和IE 对css 样式解释的差异
9.4 微线程—Stackless Python
Stackless Python是Python的一个增强版本。Stackless Python修改了Python的代码,提供了对微线程的支持。微线程是轻量级的线程,与前边所讲的线程相比,微线程在多个线程间切换所需的时间更多,占用资源也更少。
9.4.1 Stackless Python概述
Stackless Python不是必需的,它只是Python的一个修改版本,对多线程编程有更好的支持。如果在对线程应用有较高的要求时可以考虑使用Stackless Python来完成。
1.Stackless Python安装
在安装Stackless Python之前应该先安装Python,根据所安装的Python版本到Stackless Python的官方网站http://www.stackless.com下载相应的版本。对于Windows有预编译好的Stackless Python。以Python 2.5为例,下载相应的Stackless Python版本的压缩包,安装步骤如下所示。
(1)将压缩包中的python25.dll及python25_d.dll复制到Windows安装目录下的system32目录中,替换原有的python25.dll及python25_d.dll。注意在替换前应将原始的文件做好备份,以便在出现错误时恢复。
(2)将压缩包中libs目录中的文件复制到Python安装目录下的libs目录中,替换原有的文件。
(3)将压缩包中Lib目录中的文件复制到Python安装目录下的Lib目录中,替换原有的文件。
安装完成后可以在Python的交换式环境中输入如下所示代码。
import stackless
如果没有错误产生,则表示Stackless Python已经安装好了。若出现错误,则可能是Stackless Python与当前的Python版本不兼容,可以考虑使用其他版本的Python。
2.stackless模块中的tasklet对象
Stackless Python提供了stackless内置模块。stackless模块中的tasklet对象完成了与创建线程类似的功能。使用tasklet对象可以像创建线程运行函数那样来运行函数。以下实例使用tasklet对象的部分方法运行函数。
>>> import stackless # 导入stackless模块
>>> def show(): # 定义show函数
... print 'Stackless Python'
...
>>> st = stackless.tasklet(show)() # 调用tasklet添加函数,第2个括号为函数参数
>>> st.run() # 调用run方法,执行函数
Stackless Python
>>> st = stackless.tasklet(show)() # 重新生成st
>>> st.alive # 查看其状态
True
>>> st.kill() # 调用kill方法结束线程
>>> st.alive # 查看其状态
False
>>> stackless.tasklet(show)() # 直接调用tasklet
<stackless.tasklet object at 0x011DD3F0>
>>> stackless.tasklet(show)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 调用模块的run方法
Stackless Python
Stackless Python
3.stackless模块中的schedule对象
stackless模块中的schedule对象可以控制任务的执行顺序。当有多个任务时,可以使用schedule对象使其依次执行。如下代码使用schedule对象控制任务顺序。
>>> import stackless # 导入stackless模块
>>> def show(): # 定义show函数
... stackless.schedule() # 使用schedule控制任务顺序
... print 1
... stackless.schedule()
... print 2
...
>>> stackless.tasklet(show)() # 调用tasklet,生成任务列表
<stackless.tasklet object at 0x011CF830>
>>> stackless.tasklet(show)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 执行任务
1
1
2
2
4.stackless模块中的channel对象
使用stackless模块中的channel对象可以在不同的人之间进行通信,这和线程间的通信类似。使用channel对象的send方法可以发送数据。使用channel对象的receive方法可以接收数据。
>>> import stackless # 导入stackless模块
>>> def send(): # 定义send方法
... chn.send('Stackless Python') # 调用channel对象的send方法发送数据
... print 'I send: Stackless Python'
...
>>> def rec(): # 定义rec方法
... print 'I receive:',chn.receive() # 调用channel对象的receive方法接收数据
...
>>> stackless.tasklet(send)() # 调用tasklet,生成任务列表
<stackless.tasklet object at 0x011DD6B0>
>>> stackless.tasklet(rec)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 执行任务
I receive: Stackless Python
I send: Stackless Python
9.4.2 使用微线程
使用Stackless Python的内置模块stackless也可以完成多线程编程,使用起来更加方便。以下S_P_C.py脚本将前边生产者与消费者的代码改写为Stackless版,代码更加简洁。
# -*- coding:utf-8 -*-
# file: S_P_C.py
#
import stackless # 导入stackless模块
import Queue # 导入Queue模块
def Producer(i): # 定义生产者
global queue # 声明为全局Queue对象
queue.put(i) # 向队列中添加数据
print 'Producer',i, 'add',i
def Consumer(): # 定义消费者
global queue
i = queue.get() # 从队列中取出数据
print 'Consumer',i, 'get',i
queue = Queue.Queue() # 生成队列对象
for i in range(10):
stackless.tasklet(Producer)(i) # 添加生产者任务
for i in range(10):
stackless.tasklet(Consumer)() # 添加消费者任务
stackless.run() # 执行任务
运行脚本后输出如下所示。
Producer 0 add 0
Producer 1 add 1
Producer 2 add 2
Producer 3 add 3
Producer 4 add 4
Producer 5 add 5
Producer 6 add 6
Producer 7 add 7
Producer 8 add 8
Producer 9 add 9
Consumer 0 get 0
Consumer 1 get 1
Consumer 2 get 2
Consumer 3 get 3
Consumer 4 get 4
Consumer 5 get 5
Consumer 6 get 6
Consumer 7 get 7
Consumer 8 get 8
Consumer 9 get 9
Stackless Python是Python的一个增强版本。Stackless Python修改了Python的代码,提供了对微线程的支持。微线程是轻量级的线程,与前边所讲的线程相比,微线程在多个线程间切换所需的时间更多,占用资源也更少。
9.4.1 Stackless Python概述
Stackless Python不是必需的,它只是Python的一个修改版本,对多线程编程有更好的支持。如果在对线程应用有较高的要求时可以考虑使用Stackless Python来完成。
1.Stackless Python安装
在安装Stackless Python之前应该先安装Python,根据所安装的Python版本到Stackless Python的官方网站http://www.stackless.com下载相应的版本。对于Windows有预编译好的Stackless Python。以Python 2.5为例,下载相应的Stackless Python版本的压缩包,安装步骤如下所示。
(1)将压缩包中的python25.dll及python25_d.dll复制到Windows安装目录下的system32目录中,替换原有的python25.dll及python25_d.dll。注意在替换前应将原始的文件做好备份,以便在出现错误时恢复。
(2)将压缩包中libs目录中的文件复制到Python安装目录下的libs目录中,替换原有的文件。
(3)将压缩包中Lib目录中的文件复制到Python安装目录下的Lib目录中,替换原有的文件。
安装完成后可以在Python的交换式环境中输入如下所示代码。
import stackless
如果没有错误产生,则表示Stackless Python已经安装好了。若出现错误,则可能是Stackless Python与当前的Python版本不兼容,可以考虑使用其他版本的Python。
2.stackless模块中的tasklet对象
Stackless Python提供了stackless内置模块。stackless模块中的tasklet对象完成了与创建线程类似的功能。使用tasklet对象可以像创建线程运行函数那样来运行函数。以下实例使用tasklet对象的部分方法运行函数。
>>> import stackless # 导入stackless模块
>>> def show(): # 定义show函数
... print 'Stackless Python'
...
>>> st = stackless.tasklet(show)() # 调用tasklet添加函数,第2个括号为函数参数
>>> st.run() # 调用run方法,执行函数
Stackless Python
>>> st = stackless.tasklet(show)() # 重新生成st
>>> st.alive # 查看其状态
True
>>> st.kill() # 调用kill方法结束线程
>>> st.alive # 查看其状态
False
>>> stackless.tasklet(show)() # 直接调用tasklet
<stackless.tasklet object at 0x011DD3F0>
>>> stackless.tasklet(show)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 调用模块的run方法
Stackless Python
Stackless Python
3.stackless模块中的schedule对象
stackless模块中的schedule对象可以控制任务的执行顺序。当有多个任务时,可以使用schedule对象使其依次执行。如下代码使用schedule对象控制任务顺序。
>>> import stackless # 导入stackless模块
>>> def show(): # 定义show函数
... stackless.schedule() # 使用schedule控制任务顺序
... print 1
... stackless.schedule()
... print 2
...
>>> stackless.tasklet(show)() # 调用tasklet,生成任务列表
<stackless.tasklet object at 0x011CF830>
>>> stackless.tasklet(show)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 执行任务
1
1
2
2
4.stackless模块中的channel对象
使用stackless模块中的channel对象可以在不同的人之间进行通信,这和线程间的通信类似。使用channel对象的send方法可以发送数据。使用channel对象的receive方法可以接收数据。
>>> import stackless # 导入stackless模块
>>> def send(): # 定义send方法
... chn.send('Stackless Python') # 调用channel对象的send方法发送数据
... print 'I send: Stackless Python'
...
>>> def rec(): # 定义rec方法
... print 'I receive:',chn.receive() # 调用channel对象的receive方法接收数据
...
>>> stackless.tasklet(send)() # 调用tasklet,生成任务列表
<stackless.tasklet object at 0x011DD6B0>
>>> stackless.tasklet(rec)()
<stackless.tasklet object at 0x011DD570>
>>> stackless.run() # 执行任务
I receive: Stackless Python
I send: Stackless Python
9.4.2 使用微线程
使用Stackless Python的内置模块stackless也可以完成多线程编程,使用起来更加方便。以下S_P_C.py脚本将前边生产者与消费者的代码改写为Stackless版,代码更加简洁。
# -*- coding:utf-8 -*-
# file: S_P_C.py
#
import stackless # 导入stackless模块
import Queue # 导入Queue模块
def Producer(i): # 定义生产者
global queue # 声明为全局Queue对象
queue.put(i) # 向队列中添加数据
print 'Producer',i, 'add',i
def Consumer(): # 定义消费者
global queue
i = queue.get() # 从队列中取出数据
print 'Consumer',i, 'get',i
queue = Queue.Queue() # 生成队列对象
for i in range(10):
stackless.tasklet(Producer)(i) # 添加生产者任务
for i in range(10):
stackless.tasklet(Consumer)() # 添加消费者任务
stackless.run() # 执行任务
运行脚本后输出如下所示。
Producer 0 add 0
Producer 1 add 1
Producer 2 add 2
Producer 3 add 3
Producer 4 add 4
Producer 5 add 5
Producer 6 add 6
Producer 7 add 7
Producer 8 add 8
Producer 9 add 9
Consumer 0 get 0
Consumer 1 get 1
Consumer 2 get 2
Consumer 3 get 3
Consumer 4 get 4
Consumer 5 get 5
Consumer 6 get 6
Consumer 7 get 7
Consumer 8 get 8
Consumer 9 get 9
发表评论
-
apns批量使用失败
2012-04-17 19:22 2477突然某一天app 调用 apns 用户莫名其妙收不到, ... -
pylons 中 wsgiapp 和 wsgicontroller 的关系
2011-09-05 02:43 680pylons 看了好久了,喜欢的他精简封装,就想它自己的 ... -
[转] Python 面试题集合
2011-07-27 01:48 1516Python 面试题集合 发布时间:2011-07- ... -
nginx 下 用fastcgi 模式使用 webpy
2011-07-24 00:23 863nginx ---------------------- ... -
【外刊IT评论】Python 程序员的进化
2011-02-11 00:07 1070不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题, ... -
paramiko 的ssh登录
2011-01-04 17:43 1140import paramiko socks=('192. ... -
getattribute getattr
2010-09-11 21:53 792class D(object): def ... -
python 打包【转】
2010-09-02 00:33 1640python的第三方模块越来 ... -
python 3D相关
2009-02-24 23:24 1238Python是什么>? 它不是蟒蛇,而是一种早期产生于L ... -
蛋蛋的python把老子吓死了
2009-02-13 16:23 1252今天无意中敲 python的老窝, 敲到 www.python ... -
我的第一个python应用
2009-02-12 01:47 4977我的一个python应用做完了!哈哈,自己自学python时间 ... -
网上有人实现的飞信的协议
2009-02-09 14:01 808http://cocobear.info/blog/2008/ ... -
python加cookie访问
2009-02-08 23:28 2607import httplib, urllib def t ... -
Python 中的元类编程
2009-01-05 01:56 708最近看python 遇到python的元类编程。 查到这篇文 ... -
[转]常用的python模块
2009-01-02 01:51 1761adodb:我们领导推荐的数据库连接组件 bsddb3:Be ... -
[转]制作Python的安装模块
2009-01-02 01:44 2896Python模块的安装方法: 1. 单文件模块 ... -
python 中文编码的处理
2008-12-31 19:10 4391在win下写点python的代码,对utf-8 老是处理不过来 ... -
用C语言扩展Python的功能
2008-12-21 11:08 1309Pyton和C分别有着各自的 ... -
pyinstaller 来建立linux下的python独立执行文件
2008-12-09 10:21 2476以下内容假定已安装好Python 2.4/2.5 一、下载并 ... -
stackless python
2008-11-26 18:33 2304Stackless Python 并发式编程介绍 作者: Gr ...
相关推荐
因为 Stackless Python 的微线程调度是完全由解释器控制的,所以可以避免标准 Python GIL(全局解释器锁)带来的限制,使得计算密集型任务也能在多核处理器上并行运行。 总的来说,Stackless Python 提供了一种高效...
协程,又称微线程,是一种用户级的并发机制,由程序员控制执行流程。与线程不同,协程不会被操作系统调度,而是通过代码中的协作(如`yield`关键字)来切换执行上下文。协程提高了系统的并发性能,因为它们避免了...
我在网上找的《Stackless Python 并发式编程...Stackless为Python带来的微线程扩展,是一种低开销、轻量 级的便利工具,如果使用得当,可以获益如下: + 改进程序结构 + 增进代码可读性 + 提高编程人员生产力 ……
`Curio`是由David Beazley创建的一个Python协程库,它以微线程为基础,利用了Python的生成器和语法糖async/await,提供了一种低级但高效的方式来处理并发任务。与asyncio相比,Curio更注重性能和线程安全,设计上更...
STM32是一款基于ARM Cortex-M内核的微控制器,它在嵌入式系统设计中广泛应用。标题中的"stm32跑线程.rar"表明...如果你对STM32的Python编程感兴趣,需要进一步研究提供的压缩包内容以及相关的Python微控制器库和教程。
在Python编程领域,串口通信(Serial Communication)是一种常见的设备交互方式,特别是在嵌入式系统如STM32微控制器与上位机之间进行数据传输时。本项目标题为"python实时读取串口数据并自动保存至excel",其主要...
标题中的“基于Python写的一个多线程”表明我们将探讨如何使用Python编程语言实现多线程技术。在Python中,多线程是并发执行任务的一种方式,它可以提高程序的效率,尤其是在处理I/O密集型任务时,如从网络获取数据...
理解GIL(全局解释器锁)对Python多线程的理解至关重要。 3. **正则表达式**: - 正则表达式是用于匹配字符串模式的强大工具。Python中的re模块提供了正则表达式的完整功能,包括匹配、查找、替换等操作。熟练掌握...
Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下: (1)改进程序结构 (2)增进代码可读性 (3)提高编程人员生产力 以上是Stackless Python很简明的...
Stackless Python是一种特殊的Python实现,它扩展了标准Python解释器的功能,特别适合处理并发和微线程。在本文中,我们将深入探讨如何使用Stackless Python来构建一个聊天室服务器,以此来理解其在多任务环境中的...
Stackless Python是一种特殊的Python实现,它扩展了标准Python解释器的功能,主要专注于并行处理、微线程(microthreads)和高效的任务切换。这个PPT很可能是为了在公司内部推广Stackless Python,介绍其特点、优势...
Stackless Python 是一种扩展了标准Python解释器的版本,它主要关注并发编程和微线程的实现。在标准Python中,每个线程都有自己的堆栈,这在处理大量并发任务时可能会导致资源浪费和效率低下。Stackless Python通过...
Stackless Python是Python的一个增强版本,它引入了一种低开销、轻量级的微线程扩展,这种扩展允许开发者利用线程式的编程模式,同时避免传统多线程编程中的性能瓶颈与复杂性问题。通过正确应用Stackless Python提供...
标题 "电压数据采集python源码" 暗示我们关注的...总之,这个项目涉及的知识点包括Python编程、硬件接口、实时数据处理、错误处理、数据存储、多线程编程、设备通信协议、数据分析、GUI开发以及可能的嵌入式系统编程。
在Python 2.7中,对于带有线程本地存储(TLS)的多线程二进制,使用了这个标识。 4. **manylinux1**:这是针对Linux平台的一个特殊标记,意味着这个wheels包符合“manylinux1”规范。这个规范确保了这个包可以在...
- **多线程/异步**:为了提高爬取效率,可以使用Python的`threading`库或`asyncio`库实现并发请求。 - **Scrapy框架**:对于更复杂的爬虫项目,可以使用Scrapy,这是一个强大的Web爬虫框架,提供了完整的功能和结构...
- **线程与并发**:CUP提供了线程池和协程的支持,帮助开发者高效地进行多任务并行处理。 - **数据处理**:库内包含了一些常用的序列化和反序列化工具,如JSON、XML,以及数据验证和清洗的功能。 - **异常处理**:...
Python的`threading`和`asyncio`库提供了多线程和异步编程的支持,使开发者能够有效地管理资源,优化性能。 书中可能还会介绍网络服务的开发,如RESTful API的设计和实现,以及WebSockets的使用,这些都是现代网络...