`
shake863
  • 浏览: 637459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python 微线程

阅读更多
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
分享到:
评论

相关推荐

    用Python生成器实现微线程编程的教程

    微线程领域(至少在 Python 中)一直都是 Stackless Python 才能涉及的特殊增强部分。关于 Stackless 的话题以及最近它经历的变化,可能本身就值得开辟一个专栏了。但其中简单的道理就是,在“新的 Stackless”下,...

    Stackless Python 并发式编程介绍

    我在网上找的《Stackless Python 并发式编程...Stackless为Python带来的微线程扩展,是一种低开销、轻量 级的便利工具,如果使用得当,可以获益如下: + 改进程序结构 + 增进代码可读性 + 提高编程人员生产力 ……

    python-2.6.5-stackless.msi

    Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下:  (1)改进程序结构  (2)增进代码可读性  (3)提高编程人员生产力  以上是Stackless Python很简明的...

    基于Python写的一个多线程

    基于Python写的一个多线程

    python并发式编程教程之stackless

    Stackless Python 是Python编程语言的一个增强版本,它使...Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下:改进程序结构、增进代码可读性、提高编程人员生产力。

    python-3.1.2-stackless.msi

    Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具,如果使用得当,可以获益如下:  (1)改进程序结构  (2)增进代码可读性  (3)提高编程人员生产力  以上是Stackless Python很简明的...

    PSP-StacklessPython:适用于 Sony PSP 的 Stackless Python 2.5 端口

    Stackless 添加到 Python 的微线程是一种廉价且轻量级的便利,如果使用得当,可以带来以下好处: Improved program structure. More readable code. Increased programmer productivity. 查看 BasicInstallandU

    Stackless Python 并发式编程介绍.doc

    Python 的并发编程技术 目录 • 1 介绍 o 1.1 为什么要用stackless  1.1.1 现实世界就是并发的  1.1.2 并发可能是(仅仅可能是)下一个重要的编程范式 o 1.2 安装Stackless • 2 Stackless起步 o 2.1 微...

    python3之携程yield及greenlet

    协程,又称微线程,纤程。英文名Coroutine。 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断...

    PyPy2 v590 Python 2.7.13

    PyPy还有一个单独的支持微线程的版本。 另外,PyPy 也有 每夜构建 版本供开发者测试。 PyPy是作为Specific Targeted Research Projects(特定领域研究项目)从2004年12月到2007年3月,开始接受欧盟的援助。

    Python中协程用法代码详解

    协程,又称微线程,纤程。英文名Coroutine。 首先我们得知道协程是啥?协程其实可以认为是比线程更小的执行单元。 为啥说他是一个执行单元,因为他自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换...

    企业微信会话存档源代码

    1.企微会话存档数据官方解析处理流程,多线程同步,保证速度和效率 2.注释清晰,开箱即用 3.默认实时记录seq队列值,增量运行 4.动态同步指定范围数据 5.cos文件上传 6.es数据存储 7.敏感词过滤

    Python greenlet实现原理和使用示例

    最近开始研究Python的并行开发技术,包括多线程,多... python 有一个非常有名的库叫做 stackless ,用来做并发处理, 主要是弄了个叫做tasklet的微线程的东西, 而greenlet 跟stackless的最大区别是, 他很轻量级?不

    Python协程 yield与协程greenlet简单用法示例

    协程,又称微线程,纤程。英文名Coroutine。 协程是啥 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样...

    本科毕业设计+python基于flask构建微电影网站,已部署测试(附线上部署过程),增加异步功能,发送弹幕,速率控制等

    本科毕业设计+python基于flask构建微电影网站,已部署测试(附线上部署过程),增加异步功能,发送弹幕,速率控制等 已经部署到 Linux+mysql+nginx+uwsgi 环境中,下面会有教程 特性 基于蓝图创建红图,更好细分模块与...

    Power-DoS:Power-DoS是使用UDP泛洪的微型多线程拒绝服务工具。 用Python 3制成

    多线程 Umcódigorápidoe compacto 文本间的互动 配置文件 科摩磨损? Primeiramente,克隆ela: git clone https://github.com/Black-Hell-Team/Power-DoS.git 阿戈拉(Agora),无需直接输入: cd Power-DoS ...

    使用Python中的greenlet包实现并发编程的入门教程

    greenlet 包是 Stackless 的副产品,其将微线程称为 “tasklet” 。tasklet运行在伪并发中,使用channel进行同步数据交换。 一个”greenlet”,是一个更加原始的微线程的概念,但是没有调度,或者叫做协程。这在你...

    python使用协程实现并发操作的方法详解

    协程是一种用户态的轻量级线程,又称微线程。 协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的...

    基于python的人脸识别毕业设计

    该系统的界面使用 MFC 编写,在具体实现中了应用了多线程编程技术实现了一个简 单的生产者消费者模型,从而提高了系统的识别效率,另外,对人脸的识别模块还 使用了 Python,C++混合编程技术引入了 Google 的开源...

Global site tag (gtag.js) - Google Analytics