Python协程--生成器(实现多任务)

0.生成器

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

1.使用yield完成多任务

import timedef task_1():while True:print("---1----")time.sleep(0.1)yielddef task_2():while True:print("---2----")time.sleep(0.1)yielddef main():t1 = task_1()t2 = task_2()# 先让t1运行一会,当t1中遇到yield的时候,再返回到24行,然后# 执行t2,当它遇到yield的时候,再次切换到t1中# 这样t1/t2/t1/t2的交替运行,最终实现了多任务....协程while True:next(t1)next(t2)if __name__ == "__main__":main()

运行结果:

---1----
---2----
---1----
---2----
---1----
---2----
---1----
...

2.使用greenlet完成多任务

在这里插入图片描述

from greenlet import greenlet
import timedef test1():while True:print("---A--")gr2.switch()time.sleep(0.5)def test2():while True:print("---B--")gr1.switch()time.sleep(0.5)#创建生成器对象
gr1 = greenlet(test1)
gr2 = greenlet(test2)#切换到gr1中运行,开始输出
gr1.switch()

运行结果:

---A--
---B--
---A--
---B--
---A--
....

3.使用gevent完成多任务

在这里插入图片描述

import gevent
import timedef f1(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延时、堵塞等操作,都需要换成gevent里边的相应方法def f2(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延时、堵塞等操作,都需要换成gevent里边的相应方法def f3(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5)  #延时、堵塞等操作,都需要换成gevent里边的相应方法print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()   # 堵塞,等待完成
g2.join()   # 堵塞,等待完成
g3.join()   # 堵塞,等待完成

运行结果:

----1---
----2---
----3---
----4---
<Greenlet at 0x15bf8f917b8: f1(5)> 0
<Greenlet at 0x15bf8f918c8: f2(5)> 0
<Greenlet at 0x15bf8f919d8: f3(5)> 0
<Greenlet at 0x15bf8f917b8: f1(5)> 1
<Greenlet at 0x15bf8f918c8: f2(5)> 1
<Greenlet at 0x15bf8f919d8: f3(5)> 1
<Greenlet at 0x15bf8f917b8: f1(5)> 2
<Greenlet at 0x15bf8f918c8: f2(5)> 2
<Greenlet at 0x15bf8f919d8: f3(5)> 2
<Greenlet at 0x15bf8f917b8: f1(5)> 3
<Greenlet at 0x15bf8f918c8: f2(5)> 3
<Greenlet at 0x15bf8f919d8: f3(5)> 3
<Greenlet at 0x15bf8f917b8: f1(5)> 4
<Greenlet at 0x15bf8f918c8: f2(5)> 4
<Greenlet at 0x15bf8f919d8: f3(5)> 4

注意,此时使用的延时是gevent.sleep(0.5),若使用time.sleep(0.5),则输出结果如下:

----1---
----2---
----3---
----4---
<Greenlet at 0x2b3ce8917b8: f1(5)> 0
<Greenlet at 0x2b3ce8917b8: f1(5)> 1
<Greenlet at 0x2b3ce8917b8: f1(5)> 2
<Greenlet at 0x2b3ce8917b8: f1(5)> 3
<Greenlet at 0x2b3ce8917b8: f1(5)> 4
<Greenlet at 0x2b3ce8918c8: f2(5)> 0
<Greenlet at 0x2b3ce8918c8: f2(5)> 1
<Greenlet at 0x2b3ce8918c8: f2(5)> 2
<Greenlet at 0x2b3ce8918c8: f2(5)> 3
<Greenlet at 0x2b3ce8918c8: f2(5)> 4
<Greenlet at 0x2b3ce8919d8: f3(5)> 0
<Greenlet at 0x2b3ce8919d8: f3(5)> 1
<Greenlet at 0x2b3ce8919d8: f3(5)> 2
<Greenlet at 0x2b3ce8919d8: f3(5)> 3
<Greenlet at 0x2b3ce8919d8: f3(5)> 4

4.gevent打补丁

有耗时操作时,需要将程序中用到的耗时操作的代码,替换成gevent中自己实现的模块,比如讲time.sleep(0.5)自动替换gevent.sleep(0.5),需要打补丁,方法如下:

首先导入:from gevent import monkey
然后执行:monkey.patch_all()

import gevent
import time
from gevent import monkey# 有耗时操作时,需要将程序中用到的耗时操作的代码,替换成gevent中自己实现的模块
monkey.patch_all()def f1(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f2(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f3(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()
g2.join()
g3.join()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术分享连载(六十一)

资源管理 Q1&#xff1a;Unity5.4.1中&#xff0c;我将需要的Shader打到一个AssetBundle包中&#xff08;包含一个关联了所有Shader的Shader Variants&#xff09;&#xff0c;分别用Shader.WarmupAllShaders和ShaderVariantCollection.WarmUp两种方式进行预加载&#xff0c;后…

RabbitMQ(三) 集群配置

RabbitMQ——集群配置 之前不管是搞Redis、SQL、Mongo还是其他的东西&#xff0c;一律都没说过集群要怎么搞&#xff0c;电脑实在是带不动、说透彻点就是懒&#xff0c;懒得搭也懒得写&#xff0c;今日深刻意识到错误&#xff0c;做学问是不能懒的&#xff0c;会被人喷的&#…

mysql update实质,UPDATE注射(mysql+php)的两个模式

UPDATE注射(mysqlphp)的两个模式2021-01-23 7:48:35424UPDATE注射(mysqlphp)的两个模式文/安全天使SuperHei2005.8.11一.测试环境&#xff1a;OS:Windowsxpsp2php:php4.3.10(mysql4.1.9apache1.3.33二.测试数据库结构&#xff1a;-----start-----数据库:test------------------…

数据库系统的特点

数据结构化数据的共享性高&#xff0c;冗余度低且易扩充数据独立性高数据由数据库管理系统统一管理和控制

SNF软件开发机器人-子系统-导出-导入功能-多人合作时这个功能经常用到

导出 导出可以将资源表和子系统导出并形成一个json文件。 1.效果展示&#xff1a; 2.使用说明&#xff1a; 点击导出按钮后会弹出一个导出页面。页面的左侧可以选择功能&#xff0c;右侧可以选择资源表&#xff0c;选择功能的同时右侧中功能所需的资源表也会被选择。当功能之间…

基于物理的渲染-用真实的环境光照亮物体

目前&#xff0c;在游戏引擎中用于照亮物体的光源非常丰富。其中&#xff0c;比较常用的有&#xff1a;平行方向光、点光源、聚光灯以及体积光等&#xff0c;但它们都是对真实光源的近似&#xff0c;并不能很好地模拟真实世界中的复杂光照情况。为了增加光照效果的真实感&#…

php中取出数组中指定的值,PHP除开数组中指定的值

PHP去除数组中指定的值//一维数组简单的做法 unset($arr[array_search($value,$arr)])$arr array("a","b","c","d");function isHave($var){if($var!"b")return true;}$arr_filter array_values(array_filter($arr,"…

实体以及实体型和实体集

实体&#xff08;Entity&#xff09; 客观存在并可相互区别的事物称为实体。 可以是具体的人、事、物或抽象的概念。 属性&#xff08;Attribute&#xff09; 实体所具有的某一特性称为属性。 一个实体可以由若干个属性来刻画。 实体型&#xff08;Entity Type&#xf…

mysql中locat函数,MySQL中的LOCATE和POSITION函数使用方法 | 很文博客

不常用&#xff1a;MySQL中的LOCATE和POSITION函数LOCATE(substr,str)POSITION(substr IN str)返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在&#xff0c;返回值为 0&#xff1a;mysql> SELECT LOCATE(bar, ‘foobarbar);-> 4mysql…

什么是数据的完整性约束

为了防止不符合规范的数据进入数据库&#xff0c;在用户对数据进行插入、修改、删除等操作时&#xff0c;DBMS自动按照一定的约束条件对数据进行监测&#xff0c;使不符合规范的数据不能进入数据库&#xff0c;以确保数据库中存储的数据正确、有效、相容。

Python--协程(gevent模块)

一&#xff1a;前言 协程又称为微线程&#xff0c;纤程。英文名Coroutine:协程是一种用户态的轻量级线程 协程拥有自己的寄存器上下文和栈。协程调度切换时&#xff0c;将寄存器上下文和栈保存到其他地方&#xff0c;在切回来的时候&#xff0c;恢复之前保存的寄存器上下文和…

ffmpeg 0.6.3 代码, 经过我努力,能够在vs 2005 下单步调试代码

1. ffmpeg-0.6.3_modify.7z 是修改后的ffmepg的代码&#xff1b; 2.ffmpeg-0.6.3_srouce.tar.bz2 是ffmpeg原始代码&#xff1b; 3.SDL-devel-1.2.15-VC.zip 是图像显示使用使用的sdl代码&#xff1b; 4.w_cc_p_10.1.020.exe 是vc 2005 需要使用的编译器&#xff1b…

克隆CentOS6虚拟机eth0被修改为eth1如何修改eth0

2019独角兽企业重金招聘Python工程师标准>>> 直接修改 /etc/sysconfig/network-script/ifcfg-eth0 删掉UUID HWADDR 配置静态地址 然后&#xff1a; rm -rf  /etc/udev/rules.d/70-persistent-net.rules然后reboot 转载于:https://my.oschina.net/hengbao666/blog/…

[Hnoi2013]消毒

Description 最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故&#xff0c;他的分格实验皿是一个长方体,其尺寸为abc&#xff0c;a、b、c 均为正整数。为了实验的方便&#xff0c;它被划分为abc个单位立方体区域&#xff0c;每个单位立方体尺寸 为111。用(i,…

php按照文件名字排序,php readdir 排序问题,如何按照日期进行排序

目前是这么写的&#xff1a;function posts_get($directory,$ext){if (is_dir($directory)) {$handle opendir($directory);while ($file readdir($handle)){$subdir $directory . / .$file;if ($file ! . && $file !.. && is_dir($subdir)){posts_get($sub…

关系模型的名词

关系&#xff08;Relation&#xff09;一个关系对应通常说的一张表元组&#xff08;Tuple&#xff09;表中的一行即为一个元组属性&#xff08;Attribute&#xff09;表中的一列即为一个属性&#xff0c;给每一个属性起一个名称即属性名主码&#xff08;Key&#xff09;也称码键…

物理卷、卷组、逻辑卷

参考文章&#xff1a; 相关文献 谢谢作者分享!

fibonacci数列的题目——剑指Offer

https://www.nowcoder.net/practice/c6c7742f5ba7442aada113136ddea0c3?tpId13&tqId11160&tPage1&rp1&ru/ta/coding-interviews&qru/ta/coding-interviews/question-ranking 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&#xff0c;请你输出…

如何高效的编写与同步博客 (.NET Core 小工具实现)

系列目录 [如何高效的编写与同步博客&#xff08;一&#xff09;- 编写 ]如何高效的编写与同步博客&#xff08;二&#xff09;- 快速发布到多个渠道一.前言 写博客&#xff0c;可以带给我们很多好处&#xff0c;比如可以让我们结识更多志同道合的人&#xff1b;在写博客过程中…