您的位置:首页 > 编程语言 > Python开发

python协程的多种实现方式

2017-11-16 17:02 477 查看
协程简介:

协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。

一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

(以上摘自百度百科)

简单的来讲就是在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再换到原来的函数都由开发者自己确定

协程的实现方式有很多,这里我们来列举三种基本方式.

第一种 利用 yield 来实现协程:

import time

def work1():
# 循环打印数字1
while True:

print("-----1-----")
# yield可以暂时挂起该函数,跳转到调用该函数的下方
yield
# 延迟一秒以便观察
time.sleep(1)

def work2():

while True:

print("-----2-----")
yield
time.sleep(1)

th1 = work1()
th2 = work2()

while True:
# 唤醒被挂起的函数
next(th1)
next(th2)


第二种 利用 greenlet 模块实现:

import time
import greenlet

def work1():
# 循环打印字符串
while True:

print("----1----")
# 启动th2
th2.switch()
time.sleep(1)

def work2():
# 循环打印字符串
while True:

print("----2----")
# 启动th1
th1.switch()
time.sleep(1)

# 创建携程
th1 = greenlet.greenlet(work1)
th2 = greenlet.greenlet(work2)
# 启动携程
th1.switch()


greenlet已经实现了协程,但是这个还得人工切换,是不是觉得很麻烦,python还有一个比greenlet更强大的并且能够自动切换任务的模块 gevent

第三种:

import gevent

import time

def work1():
# 循环打印
while True:

print("----1----")
# 破解sleep 使sleep不再阻塞
gevent.sleep(1)

def work2():

while True:

print("----2----")

gevent.sleep(1)

# 创建并开始执行携程
th1 = gevent.spawn(work1)
th2 = gevent.spawn(work2)
# 阻塞等待携程结束
gevent.joinall([th1,th2])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 线程 协程