- 浏览: 637459 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2351突然某一天app 调用 apns 用户莫名其妙收不到, ... -
pylons 中 wsgiapp 和 wsgicontroller 的关系
2011-09-05 02:43 633pylons 看了好久了,喜欢的他精简封装,就想它自己的 ... -
[转] Python 面试题集合
2011-07-27 01:48 1463Python 面试题集合 发布时间:2011-07- ... -
nginx 下 用fastcgi 模式使用 webpy
2011-07-24 00:23 822nginx ---------------------- ... -
【外刊IT评论】Python 程序员的进化
2011-02-11 00:07 1035不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题, ... -
paramiko 的ssh登录
2011-01-04 17:43 1096import paramiko socks=('192. ... -
getattribute getattr
2010-09-11 21:53 749class D(object): def ... -
python 打包【转】
2010-09-02 00:33 1608python的第三方模块越来 ... -
python 3D相关
2009-02-24 23:24 1199Python是什么>? 它不是蟒蛇,而是一种早期产生于L ... -
蛋蛋的python把老子吓死了
2009-02-13 16:23 1215今天无意中敲 python的老窝, 敲到 www.python ... -
我的第一个python应用
2009-02-12 01:47 4939我的一个python应用做完了!哈哈,自己自学python时间 ... -
网上有人实现的飞信的协议
2009-02-09 14:01 763http://cocobear.info/blog/2008/ ... -
python加cookie访问
2009-02-08 23:28 2567import httplib, urllib def t ... -
Python 中的元类编程
2009-01-05 01:56 627最近看python 遇到python的元类编程。 查到这篇文 ... -
[转]常用的python模块
2009-01-02 01:51 1726adodb:我们领导推荐的数据库连接组件 bsddb3:Be ... -
[转]制作Python的安装模块
2009-01-02 01:44 2856Python模块的安装方法: 1. 单文件模块 ... -
python 中文编码的处理
2008-12-31 19:10 4351在win下写点python的代码,对utf-8 老是处理不过来 ... -
用C语言扩展Python的功能
2008-12-21 11:08 1245Pyton和C分别有着各自的 ... -
pyinstaller 来建立linux下的python独立执行文件
2008-12-09 10:21 2441以下内容假定已安装好Python 2.4/2.5 一、下载并 ... -
stackless python
2008-11-26 18:33 2252Stackless Python 并发式编程介绍 作者: Gr ...
相关推荐
微线程领域(至少在 Python 中)一直都是 Stackless Python 才能涉及的特殊增强部分。关于 Stackless 的话题以及最近它经历的变化,可能本身就值得开辟一个专栏了。但其中简单的道理就是,在“新的 Stackless”下,...
我在网上找的《Stackless Python 并发式编程...Stackless为Python带来的微线程扩展,是一种低开销、轻量 级的便利工具,如果使用得当,可以获益如下: + 改进程序结构 + 增进代码可读性 + 提高编程人员生产力 ……
Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下: (1)改进程序结构 (2)增进代码可读性 (3)提高编程人员生产力 以上是Stackless Python很简明的...
基于Python写的一个多线程
Stackless Python 是Python编程语言的一个增强版本,它使...Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下:改进程序结构、增进代码可读性、提高编程人员生产力。
Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下: (1)改进程序结构 (2)增进代码可读性 (3)提高编程人员生产力 以上是Stackless Python很简明的...
Stackless 添加到 Python 的微线程是一种廉价且轻量级的便利,如果使用得当,可以带来以下好处: Improved program structure. More readable code. Increased programmer productivity. 查看 BasicInstallandU
Python 的并发编程技术 目录 • 1 介绍 o 1.1 为什么要用stackless 1.1.1 现实世界就是并发的 1.1.2 并发可能是(仅仅可能是)下一个重要的编程范式 o 1.2 安装Stackless • 2 Stackless起步 o 2.1 微...
协程,又称微线程,纤程。英文名Coroutine。 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断...
PyPy还有一个单独的支持微线程的版本。 另外,PyPy 也有 每夜构建 版本供开发者测试。 PyPy是作为Specific Targeted Research Projects(特定领域研究项目)从2004年12月到2007年3月,开始接受欧盟的援助。
协程,又称微线程,纤程。英文名Coroutine。 首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换...
1.企微会话存档数据官方解析处理流程,多线程同步,保证速度和效率 2.注释清晰,开箱即用 3.默认实时记录seq队列值,增量运行 4.动态同步指定范围数据 5.cos文件上传 6.es数据存储 7.敏感词过滤
最近开始研究Python的并行开发技术,包括多线程,多... python 有一个非常有名的库叫做 stackless ,用来做并发处理, 主要是弄了个叫做tasklet的微线程的东西, 而greenlet 跟stackless的最大区别是, 他很轻量级?不
协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样...
本科毕业设计+python基于flask构建微电影网站,已部署测试(附线上部署过程),增加异步功能,发送弹幕,速率控制等 已经部署到 Linux+mysql+nginx+uwsgi 环境中,下面会有教程 特性 基于蓝图创建红图,更好细分模块与...
多线程 Umcódigorápidoe compacto 文本间的互动 配置文件 科摩磨损? Primeiramente,克隆ela: git clone https://github.com/Black-Hell-Team/Power-DoS.git 阿戈拉(Agora),无需直接输入: cd Power-DoS ...
greenlet 包是 Stackless 的副产品,其将微线程称为 “tasklet” 。tasklet运行在伪并发中,使用channel进行同步数据交换。 一个”greenlet”,是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你...
协程是一种用户态的轻量级线程,又称微线程。 协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的...
该系统的界面使用 MFC 编写,在具体实现中了应用了多线程编程技术实现了一个简 单的生产者消费者模型,从而提高了系统的识别效率,另外,对人脸的识别模块还 使用了 Python,C++混合编程技术引入了 Google 的开源...