首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python网络编程——协程

TechBoard / techLee

***

微信公众号:TechBoard

***

##### 协程的概念

> 协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程

> 协程也是实现多任务的一种方式

> 协程yield的代码实现

> 简单实现协程

```

import time

# 定义协程

def work1():

while True:

print("work1...")

time.sleep(1)

yield

def work2():

while True:

print("work2...")

time.sleep(1)

yield

if __name__ == '__main__':

g1 = work1()

g2 = work2()

while True:

next(g1)

next(g2)

```

##### 实现协程的第二种方式:greenlet

> greenlet介绍:为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变得更加简单

> 首先使用pip安装greenlet模块:

```

pip3 install greenlet

```

> greenlet的使用:

```

# greentlet的使用

import greenlet

import time

def work1():

for i in range(10):

print("work1")

time.sleep(1)

g2.switch()

def work2():

for i in range(10):

print("work2")

time.sleep(1)

g1.switch()

# 创建协程并指定任务

g1 = greenlet.greenlet(work1)

g2 = greenlet.greenlet(work2)

if __name__ == '__main__':

g1.switch()

```

> 实现协程的第三种方式:gevent

> greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库——gevent

> gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行

> 由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

> 安装:

```

pip install gevent

```

###### gevent的使用

```

# gevent的使用

import gevent, time

from gevent import monkey

# gevent 遇到耗时操作(time, sleep, accept, recv, 网络请求)会切换到其他协程执行代码

# 打补丁,让gevent 能够识别耗时操作

monkey.patch_all()

# 任务1

def work1():

for i in range(10):

print("work1")

# gevent.sleep(1)

time.sleep(1)

def work2():

for i in range(10):

print("work2")

# gevent.sleep(1)

time.sleep(1)

if __name__ == '__main__':

# 创建协程并指定执行的任务

g1 = gevent.spawn(work1)

g2 = gevent.spawn(work2)

# 让主线程等待协程执行完成以后程序再退出

g1.join()

g2.join()

# 注意点:如果程序一直运行,并且还有耗时操作,那么不需要使用join

```

***

微信公众号:TechBoard

***

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180624G1B7OY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券