python协程等待执行完成_当循环运行时,如何运行协同程序并等待同步函数的结果?...

同步等待异步协同程序

如果一个异步事件循环已经通过调用loop.run_forever运行,它将阻塞执行线程,直到loop.stop被调用[请参阅docs]。因此,同步等待的唯一方法是在一个专用线程上运行事件循环,在循环上调度异步函数,然后从另一个线程同步地等待它。在

为此,我按照用户4815162342的answer编写了自己的最小解决方案。我还添加了在所有工作完成后清理循环的部分[参见^{}]。在

下面代码中的main函数在一个专用线程上运行事件循环,调度事件循环上的多个任务,以及同步等待结果的任务。同步等待将阻塞,直到所需的结果准备就绪。最后,循环被关闭,并优雅地与其线程一起清理。在

专用线程和函数stop_loop、run_forever_safe、和{}可以封装在模块或类中。在

有关线程安全的注意事项,请参阅asyncio docs中的“Concurrency and Multithreading”部分。在import asyncio

import threading

#

def stop_loop(loop):

''' stops an event loop '''

loop.stop()

print (".: LOOP STOPPED:", loop.is_running())

def run_forever_safe(loop):

''' run a loop for ever and clean up after being stopped '''

loop.run_forever()

# NOTE: loop.run_forever returns after calling loop.stop

# cancell all tasks and close the loop gracefully

print(".: CLOSING LOOP...")

# source:

loop_tasks_all = asyncio.Task.all_tasks(loop=loop)

for task in loop_tasks_all: task.cancel()

# NOTE: `cancel` does not guarantee that the Task will be cancelled

for task in loop_tasks_all:

if not (task.done() or task.cancelled()):

try:

# wait for task cancellations

loop.run_until_complete(task)

except asyncio.CancelledError: pass

#END for

print(".: ALL TASKS CANCELLED.")

loop.close()

print(".: LOOP CLOSED:", loop.is_closed())

def await_sync(task):

''' synchronously waits for a task '''

while not task.done(): pass

print(".: AWAITED TASK DONE")

return task.result()

#

async def asyncTask(loop, k):

''' asynchronous task '''

print(" start async task %s" % k)

await asyncio.sleep(3, loop=loop)

print(" end async task %s." % k)

key = "KEY#%s" % k

return key

def main():

loop = asyncio.new_event_loop() # construct a new event loop

# closures for running and stopping the event-loop

run_loop_forever = lambda: run_forever_safe(loop)

close_loop_safe = lambda: loop.call_soon_threadsafe(stop_loop, loop)

# make dedicated thread for running the event loop

thread = threading.Thread(target=run_loop_forever)

# add some tasks along with my particular task

myTask = asyncio.run_coroutine_threadsafe(asyncTask(loop, 100200300), loop=loop)

otherTasks = [asyncio.run_coroutine_threadsafe(asyncTask(loop, i), loop=loop)

for i in range(1, 10)]

# begin the thread to run the event-loop

print(".: EVENT-LOOP THREAD START")

thread.start()

# _synchronously_ wait for the result of my task

result = await_sync(myTask) # blocks until task is done

print("* final result of my task:", result)

#... do lots of work ...

print("*** ALL WORK DONE ***")

#========================================

# close the loop gracefully when everything is finished

close_loop_safe()

thread.join()

#

main()

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

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

相关文章

Hologres是如何完美支撑双11智能客服实时数仓的?

简介: 本文重点介绍Hologres如何帮助阿里巴巴客户体验部(CCO),构建集实时化、自助化、系统化于一体的用户体验实时数仓,完美助力双11场景,支持上千服务大屏,削峰30%,节约成本近30%。…

云原生与AI时代的存储该是什么样?新华三发布全NVMe智能闪存与智慧中枢数据平台

编辑 | 宋慧 出品 | CSDN云计算 7月8日,紫光股份旗下新华三集团以“智以致用速达未来”为主题,召开“2021新华三存储新品发布会”,重磅推出云智原生的新一代端到端NVMe闪存存储H3C/HPE Alletra、分布式融合存储H3C UniStor X10000&#xff0…

数据中台技术及业务发展史与未来趋势展望

作者:陈晓勇、柯根 阿里巴巴数据技术编年 简史 2003年淘宝诞生于杭州一间民居。次年,Google发表了三篇大数据论文将计算技术引入大数据时代。 2004年Doug Cutting和Mike Cafarella根据Google的论文实现了Hadoop的HDFS和MR计算框架。 2006年 Hadoop项…

java客户端程序用什么自动化测试_五大Java自动化测试框架

51CTO官微技术资讯/行业精华/产品心得多年来,Java一直是服务器端应用开发的首选编程语言。随着时间的推移和自动化测试的兴起,业界出现了许多基于Java,并根据不同的业务逻辑而发展起来的开源框架。在此,我向大家介绍并比较五种用到…

微服务框架Go-Micro集成Nacos实战之服务注册与发现

简介: 本文主要介绍如何使用 Golang 生态中的微服务框架 Go-Micro(v2) 集成 Nacos 进行服务注册与发现。(Go-Micro 目前已经是 v3 版本,但由于某些原因项目已经更名为 nitro 具体原因大家可以去 github 中查看) 相关背景知识 Go-Micro Go Micro 是一个…

「深度学习知识体系总结(2021版)」开放下载了!

随着世界技术的迭代与发展,人工智能和机器学习正在超自动化领域,扮演着越来越重要的角色。2020年的冠状病毒疫情突发,整个世界都在防疫的道路上披荆斩棘。人工智能发挥了重大作用,智能测温、智能消毒、智能建设都能看到AI的影子。…

2020双11,阿里巴巴集团数万数据库系统全面上云揭秘

作者:阿里云高级技术专家 改天阿里云高级产品专家 胜通 2020年天猫双十一成交额突破4982亿,在双十一走过12个年头之际,我们的订单创建峰值达到58.3万笔/秒,再次刷新全球在线交易系统的记录。历年双十一都是对技术人的一次大考&…

php5.6 mongo 扩展,PHP5.6的安装及redis、memcache、mongo扩展

系统版本:CentOS Linux release 7.4.1708 (Core)PHP5.6下载地址:wget http://am1.php.net/distributions/php-5.6.37.tar.gz需要装好yum的epel-release,这上面有相对应的依赖包,否则依赖包没装好编译会报错!&#xff0…

以 Kubernetes 为代表的容器技术,已成为云计算的新界面

简介: 可以说,以 Kubernetes 为代表的容器技术正成为云计算新界面。容器提供了应用分发和交付标准,将应用与底层运行环境进行解耦。Kubernetes 作为资源调度和编排的标准,屏蔽底层架构差异性,帮助应用平滑运行在不同基…

2020双11养猫技术大揭秘

简介: 你养猫了没? 作者 | 淘系-珑晴 在电商领域,互动是一个重要的用户增长方案,在提升用户黏性、活跃以及拉新上都发挥着重要的作用。今年双11,淘系互动团队推出了“超级星秀猫”,我们不盖楼、不开车&…

Linux图片马PHP,php 根据请求生成缩略图片保存到Linux图片服务器的代码

这个功能,有点类似图片站点分离的操作,就是将图片单独架设在一台服务器上,有兴趣的朋友,好好研究下吧。代码如下:复制代码 代码示例:/*** 缩略图片 Linux图片服务器* edit www.jbxue.com*/$picID$_GET[imgID];$picType…

GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)上周,微软、GitHub、OpenAI 三方联手推出的 AI 代码生成神器 GitHub Copilot 一经官宣便引起巨大关注:试问哪个开发者不想要这么一位“虚拟程序员”来解放自己的双手&#xff1f…

阿里云性能测试工具PTS介绍

简介: 性能测试 PTS(Performance Testing Service)是具备强大的分布式压测能力的 SaaS 压测平台,可模拟海量用户的真实业务场景,全方位验证业务站点的性能、容量和稳定性。 阿里云 阿里云智能GTS-平台技术部-SRE团队 1…

php微信公众号的服务器配置,微信公众号服务器配置选项PHP示例代码

最近微信公众号遇到有点奇怪的问题,使用的是tp框架,之前配置都ok的,最近有需求重新填写url选项,可配置时一直显示token失败,解决方案,参考以下php示例代码来修改,同时最好把输出注释掉。最后通过…

Dubbo 3.0 前瞻系列 | 2020双11,Dubbo3.0 在考拉的超大规模实践

很多开发者一直以来好奇:阿里自己有没有在用Dubbo,会不会用Dubbo?在刚刚结束的双11,我们了解到阿里云今年提出了“三位一体”的理念,即将“自研技术”、“开源项目”、“商业产品”形成统一的技术体系,最大…

OpenStack管理界面开源啦!

日前,木兰开源社区TOC召开了孵化项目审议会议,其项目分别覆盖数据库、大数据处理、网络、流媒体、云计算等关键领域。其中,浪潮数据纯自研产品Skyline成功入围。 自开源至今,OpenStack常被诟病的一点是原生界面不太好用&#xff…

厂商 push 不通排查指南

简介: MPS 集成多个三方渠道,保障 push 使命必达的必须知道的几件事。 为了提升「MPS 消息推送」的推送的到达率,mPaaS 集成了华为、小米等厂商的推送功能,从而有效地提高用户留存率,提升用户体验。在日常运维过程中&a…

PHP读取qq群成员,js获取QQ群成员的经典代码

本节主要内容:22 行 JavaScript 代码实现 QQ 群成员提取器。如果获取失败,可能的原因如下:1,QQ版本升级了2,博客中的代码有些繁琐22 行 JavaScript 代码实现 QQ 群成员提取器。代码:复制代码 代码示例:var …

Hologres助力飞猪双11实时数据大屏秒级响应

简介: 本文重点介绍Hologres如何落地阿里巴巴飞猪实时数仓场景,并助力飞猪双11实时数据大屏3秒起跳,全程0故障。 摘要:刚刚结束的2020天猫双11中,MaxCompute交互式分析(下称Hologres)实时计算F…

燧原科技首发国内第二代人工智能训练芯片“邃思2.0”

7月7日,燧原科技发布第二代人工智能训练产品——“邃思2.0”芯片、基于邃思2.0的“云燧T20”训练加速卡和“云燧T21”训练OAM模组,全面升级的“驭算TopsRider”软件平台以及全新的“云燧集群”,成为国内首家发布第二代人工智能训练产品组合的…