jjzjj

coroutine

全部标签

Swift 等同于 Unity3d 协程?

研究如何在Swift3中构建类似的东西。我习惯在Unity3d中使用这种架构,也许没有类似的东西来处理异步数据。我听说过完成block+使用协议(protocol)/委托(delegate)在Swift中传递数据,但我认为拥有一个获取数据的公共(public)函数然后使用协程等待所有数据都在VC中会更容易开始吧。这是我用来创建它们的C#代码:Listdata=newList;privateIENumeratorget_data(){run_async_func_to_get_data();while(data.count==0){yieldreturnnull;}yieldbreak;

python - 基于协程的状态机

我有一个棘手而有趣的问题要问你。在处理I/O任务(例如通过Twisted、Tornado中的某个传输层实现协议(protocol))时,我发现了类似的场景或模式。该模式与其说是抽象的,不如说是通用的。例如,当您使用MODEM时-就像设备一样,你向他发送命令并接收结果。但是,有时您需要使用新命令对调制解调器对上一个命令的响应使用react。例如,假设调制解调器为M,->为通信运营商,接受一个参数,消息key,服务器为S。1.s->(a)M1.1M->(b)S#modemreactson`a`as`b`;sonextweshouldsendhimcommandB1.2M->(c)S#mod

python - 支持类的 .send() 吗?

写一个类,我怎么实现foo.send(item)?__iter__允许像生成器一样迭代类,如果我希望它成为协程怎么办? 最佳答案 这是一个basicexampleofacoroutine:defcoroutine(func):defstart(*args,**kwargs):cr=func(*args,**kwargs)cr.next()returncrreturnstart@coroutinedefgrep(pattern):print"Lookingfor%s"%patternwhileTrue:line=(yield)ifpa

python - 基于生成器的协程与原生协程

我刚刚读了PEP0492谈论协程的新方法,但PEP未能让我理解基于生成器的协程和native协程之间的区别。谁能告诉我区别(也许有例子)?据我了解,他们使用了不同的词(yield/yieldfrom和await/async/yield)。我知道在native协程结束时预期会产生yield,但这对于基于生成器的协程也是如此。 最佳答案 扩展MikeS所写的内容:CPython中的原生协程与生成器共享大部分相同的代码,因此几乎没有功能差异。但是,我认为PEP-492超出了“语法糖”的阈值。生成器和native协程具有不同的目的,因此新语

python - 异步/等待做什么?

我正在尝试在python中围绕async/await进行思考。我走在正确的轨道上吗?async和@coroutine函数返回协程/生成器,而不是返回值。await提取协程/生成器的实际返回值。async函数结果(协程)旨在添加到事件循环中。await在事件循环和等待协程(启用下一点)之间创建“桥梁”。@coroutine的yield直接与事件循环通信。(跳过等待结果的直接调用者)await只能在异步函数内部使用。yield只能在@coroutine中使用。(@coroutine=@types.coroutine) 最佳答案 asyn

python - 什么会导致 asyncio.new_event_loop() 的简单调用挂起?

我正在使用以下函数来强制协程同步运行:importasyncioimportinspectimporttypesfromasyncioimportBaseEventLoopfromconcurrentimportfuturesdefawait_sync(coro:types.CoroutineType,timeout_s:int=None):""":paramcoro:acoroutineorlambdaloop:coroutine(loop):paramtimeout_s::return:"""loop=asyncio.new_event_loop()#type:BaseEventL

Python协程: Release context manager when pausing

背景:我是一位经验丰富的Python程序员,对新的协程/异步/等待功能一无所知。我不能写一个异步的“helloworld”来挽救我的生命。我的问题是:我得到了一个任意协程函数f。我想编写一个协程函数g来包装f,即我将把g给用户,就好像它是f,并且用户会调用它并且不会变得更聪明,因为g将在后台使用f。就像装饰普通Python函数以添加功能一样。我想添加的功能:每当程序流进入我的协程时,它就会获取我提供的上下文管理器,一旦程序流离开协程,它就会释放该上下文管理器。流量回来了?重新获取上下文管理器。它又出来了?重新发布它。直到协程完全结束。为了演示,这里描述了普通生成器的功能:defgene

python - 如何从python中的协程获取返回值

我正在根据http://www.dabeaz.com/coroutines/Coroutines.pdf尝试协程管道问题是,我怎样才能从sink中获取值而不只是打印它?以这段代码为例defcoroutine(func):defstart(*args,**kwargs):cr=func(*args,**kwargs)next(cr)returncrreturnstart@coroutinedefproduce(target):whileTrue:n=(yield)target.send(n*10)@coroutinedefsink():try:whileTrue:n=(yield)pri

python - 如何在 Python 中高效地将小文件上传到 Amazon S3

最近,我需要实现一个程序,以尽快将驻留在AmazonEC2中的文件上传到Python中的S3。文件大小为30KB。我尝试了一些解决方案,使用多线程、多处理、协程。以下是我在AmazonEC2上的性能测试结果。3600(文件量)*30K(文件大小)~~105M(总计)--->**5.5s[4process+100coroutine]**10s[200coroutine]14s[10threads]代码如下所示用于多线程defmput(i,client,files):forfinfiles:ifhash(f)%NTHREAD==i:put(client,os.path.join(DATA_

python - 动态添加到 Python asyncio 的事件循环应该执行的列表

我有一个函数download_all,它遍历硬编码的页面列表以按顺序下载它们。但是如果我想根据页面的结果动态添加到列表中,我该怎么做呢?例如下载第一页,解析它,并根据结果将其他页面添加到事件循环中。@asyncio.coroutinedefdownload_all():first_page=1last_page=100download_list=[download(page_number)forpage_numberinrange(first_page,last_page)]gen=asyncio.wait(download_list)returngenif__name__=='__m