如何在Python中使用Coroutines

简介: 本文介绍了在Python中使用轮询程序(coroutines)的方法及其特点。Coroutines是可暂停和恢复执行的函数,与生成器、线程和子程序有所不同。文章详细解释了coroutines的工作原理,包括如何通过`send()`方法传递数据,以及如何用`close()`方法关闭coroutine。此外,还展示了如何构建基于coroutines的流水线结构以处理数据过滤和传输任务。最后总结了coroutines的优势及与其他多任务机制的区别。

在Python中使用轮询程序

扩展的子程序被称为Coroutines。一个进程在定期或闲置的基础上自愿放弃控制,以使其他程序能够同时运行。这就是所谓的合作式多任务。

在 Python 中,生成器是构造迭代器的函数。当生成器想返回一个结果时,它使用与函数相同的语法,但不是使用return ,而是使用yield

通过一些更多的方法和产量语句的轻微变化,coroutines 与 Python 的生成器有所不同。

为了跟上进度,你应该熟悉 Python 的生成器。

什么是Python中的coroutine?

Coroutine是一个可以暂停和恢复执行的函数。

一个愿意放弃对自己控制的进程可能会从使用coroutines中受益(定期)。当一个 coroutine 处于空闲状态时,你可以同时运行程序。

由于屈服语句的利用,生成器与coroutines不同。

Coroutines与子程序

  • Coroutines可以从许多地方访问,而主函数是子程序的唯一入口。
  • 公司化的coroutines在执行时建立一个流水线结构。但在使用子程序时,你可以创建一个具有线性流程的可执行程序。
  • 在子程序中,暂停和恢复是从一个点开始的,而在coroutines中,它们是从多个点开始的。在 coroutines 中,我们仍然可以从被中断的地方恢复执行。
  • Python coroutines 没有一个主要的功能来安排和协调它们的执行。子程序在python中具有控制和协调子程序执行的主要功能。

coroutines与线程有什么不同?

操作系统按照其调度器主动运行线程,调度器是操作系统内核中的一种算法。

通过在预定的时间停止和重启函数,活动被协作性地多任务化。这是通过使用轮子程序来完成的。

Python程序中的Coroutines

Coroutines将使用send() 方法来传送名字,只有那些带有 "Student "前缀的名字才会显示在最后。

python

代码解读

复制代码

def print_cognomen (prfx):
    print("The coroutine object is looking for the prefix: {}".format(prfx))
    while True: 
    GivenCognomen = (yield) 
    if prfx in GivenCognomen:
      print(GivenCognomen) 

CorouteObject = print_cognomen("Student")

cognomen_a = input("Fill 1st cognomen : ") 
cognomen_b = input("Fill 2nd cognomen : ") 
cognomen_c = input("Fill 3rd cognomen : ") 

CorouteObject.__next__() 
CorouteObject.send(cognomen_a) 
CorouteObject.send(cognomen_b) 
CorouteObject.send(cognomen_c)

输出

txt

代码解读

复制代码

Fill 1st cognomen : 
Johson 
Fill 2nd cognomen : 
Gitau
Fill 3rd cognomen : 
Ngure
The coroutine object is looking for the prefix.: Student

在上面的代码中,名字是用send() 技术传送到函数的coroutine中。

输出结果只显示了以Student 为前缀的名字。在这种情况下,Student 已经被用作一个循环程序的关键字。

COROUTINE的执行

Python Coroutines和Python生成器有很多共同之处。然而,程序的执行只有在调用一个coroutine时才开始。

__next__() 方法被调用时,执行开始。

然后,coroutine的执行就会停顿下来,因为它在等待要发送给对象的值。

每次一个新的coroutine对象收到一个值时,在打印输出之前,它首先检查确定是否有指定的前缀存在。

__next__() 表达式会重复进行,直到你看到name = (yield)

如何关闭coroutines

必须调用close() 方法来停止一个 coroutine。

GeneratorExit 异常是通过先停止coroutine来捕获的。这是我们收集异常的常用方法。

python

代码解读

复制代码

def print_cognomen(prfx): 
    print("The coroutine object is looking for the prefix: {}".format(prfx)) 
    try: 
        while True: 
          GivenCognomen = (yield) 
          if prfx in GivenCognomen:
              print(GivenCognomen) 
    except GeneratorExit:
        print("The coroutine has been shut off.!!")

CorouteObject = print_cognomen("Student")

CorouteObject.__next__()

CorouteObject.send("Kelvin") 
CorouteObject.send("Student Johnson Murie") 
CorouteObject.send("Student Brian Mumo")

CorouteObject.close()

输出

txt

代码解读

复制代码

The coroutine object is looking for the prefix: Student
Student Johnson Murie
Student Brian Mumo
The coroutine has been shut off.!!

注意,如果你试图在冠状动脉被终止后向冠状动脉对象发送数据,将会抛出一个StopIteration exception

使用连锁的coroutines构建流水线

Coroutines可以被用来配置管道。例如,我们可以使用send() 函数来连接coroutines并通过管道发送数据。

以下是管道的一些要求。

  • 整个管道是从一个单一的源头(生产者)下来的。在大多数情况下,生产者是一个简单的过程而不是一个coroutine。
  • 管道的最终目的地是一个水槽。所有的数据都可能被收集并显示在一个水槽中。

下面是一个具有管道结构的coroutine程序的例子。

python

代码解读

复制代码

def creator(StatedPhrase, AdjacentCoroutine): 
  notes = StatedPhrase.split(" ") 
  for note in notes:
    AdjacentCoroutine.send(notes) 
  AdjacentCoroutine.close() 

def model_seep(SearchModel = "ing", AdjacentCoroutine = None): 
  print("We are looking for terms that conclude with{}".format(SearchModel))
  try: 

    while True: 
      note = (yield) 
      if SearchModel in note: 
        AdjacentCoroutine.send(notes) 
  except GeneratorExit:
    print("Done filtering filled sentences.!!")

def print_note(): 
  print("I'm a pipeline sink who prints the specified notes.") 
  try: 
    while True: 
      note = (yield) 
      print(note)
  except GeneratorExit: 
    print("Finished printing.!")

PrintNote = print_note()
PrintNote.__next__()

ModelSeep = model_seep(AdjacentCoroutine = PrintNote) 
ModelSeep.__next__()

StatedPhrase = "Dickson mutei is chasing a fast train." 
creator(StatedPhrase, ModelSeep)

输出

txt

代码解读

复制代码

I'm a pipeline sink who prints the specified notes.
We are looking for terms that conclude withing
Done filtering filled sentences.!!
Finished printing.!

在上面的代码中,一个管道可能会利用各种各样的coroutine和数据过滤方法。

我们可以在流水线的输出中观察到过滤后的数据。

总结

在本教程中,我们讨论了什么是轮子线,以及如何实现和管理它们。

Coroutines与线程和子程序不同,因为它们可以很容易地暂停和重新启动。


转载来源:https://juejin.cn/post/7168376072738701326

目录
打赏
0
6
6
0
190
分享
相关文章
异步编程在Python中的应用:Asyncio和Coroutines
异步编程在Python中的应用:Asyncio和Coroutines
77 1
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
51 1
Python编程精进:正则表达式
正则表达式是一种强大的文本处理工具,用于搜索、匹配和提取模式。本文介绍了正则表达式的语法基础,如`\d`、`\w`等符号,并通过实例展示其在匹配电子邮件、验证电话号码、处理日期格式等场景中的应用。同时,文章提醒用户注意性能、编码、安全性等问题,避免常见错误,如特殊字符转义不当、量词使用错误等。掌握正则表达式能显著提升文本处理效率,但需结合实际需求谨慎设计模式。
|
1月前
|
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
165 33
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
99 11
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
157 28
|
4月前
|
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
71 4
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问