草庐IT

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 - 我们如何调用需要协程的普通函数?

考虑调用另一个协程的协程:asyncdeffoo(bar):result=awaitbar()returnresult如果bar是一个协同程序,这会很好地工作。我需要做什么(即,我需要用什么来包装对bar的调用),以便在bar是一个普通函数的情况下,这段代码做正确的事情?即使它从不执行任何异步操作(即从不使用await),也完全可以使用asyncdef定义协程。但是,问题询问如何在foo的代码中包装/修改/调用常规函数bar以便可以等待bar。 最佳答案 用asyncio.coroutine简单地包装你的同步函数如果需要:ifnot

python - python 中的协程在 3.4 和 3.5 之间,如何保持向后兼容性?

我正在使用asyncio开发python聊天机器人框架。但是我看PEP-492还有新的语法,async/await,最后它被接受了。我喜欢async/await语法,我想使用它。但我担心3.4backwords兼容性。如果我在我的代码中使用新语法,有人可以在3.4中使用它吗?比如我写了这样一段代码,importasyncioclassChatBot:def__init__(self,loop):self.loop=loopasyncdefconnect(self):self.reader,self.writer=awaitasyncio.open_connect(HOST,PORT,l

python - 在 asyncio.Protocol.data_received 中调用协程

我在新Pythonasyncio模块的asyncio.Protocol.data_received回调中执行异步操作时遇到问题。考虑以下服务器:classMathServer(asyncio.Protocol):@asyncio.coroutinedefslow_sqrt(self,x):yieldfromasyncio.sleep(1)returnmath.sqrt(x)deffast_sqrt(self,x):returnmath.sqrt(x)defconnection_made(self,transport):self.transport=transport#@asyncio.

python - 为什么在使用带有 asyncio 的协程的列表推导式时会得到不同的结果?

我最初有一些代码将结果聚合到一个列表中。当我重构此代码以使用列表综合时,我得到了意想不到的结果:importasyncio@asyncio.coroutinedefcoro():return"foo"#Writingthecodewithoutalistcompworks,#evenwithanasyncio.sleep(0.1).@asyncio.coroutinedefgood():yieldfromasyncio.sleep(0.1)result=[]foriinrange(3):current=yieldfromcoro()result.append(current)retur

python - 为什么在使用带有 asyncio 的协程的列表推导式时会得到不同的结果?

我最初有一些代码将结果聚合到一个列表中。当我重构此代码以使用列表综合时,我得到了意想不到的结果:importasyncio@asyncio.coroutinedefcoro():return"foo"#Writingthecodewithoutalistcompworks,#evenwithanasyncio.sleep(0.1).@asyncio.coroutinedefgood():yieldfromasyncio.sleep(0.1)result=[]foriinrange(3):current=yieldfromcoro()result.append(current)retur

Python 原生协程和 send()

基于生成器的协程有一个send()方法,它允许调用者和被调用者之间进行双向通信,并从调用者恢复生成的生成器协程。这是将生成器变成协程的功能。虽然新的原生async/await协程为异步I/O提供了出色的支持,但我看不出如何使用它们获得与send()等效的功能。明确禁止在async函数中使用yield,因此native协程只能使用return语句返回一次。虽然await表达式将新值带入协程,但这些值来自被调用者,而不是调用者,并且等待的调用每次都从头开始计算,而不是从它停止的地方计算。有没有办法从中断处恢复返回的协程并可能发送新值?我如何模仿DavidBeazley的CuriousCou

Python 原生协程和 send()

基于生成器的协程有一个send()方法,它允许调用者和被调用者之间进行双向通信,并从调用者恢复生成的生成器协程。这是将生成器变成协程的功能。虽然新的原生async/await协程为异步I/O提供了出色的支持,但我看不出如何使用它们获得与send()等效的功能。明确禁止在async函数中使用yield,因此native协程只能使用return语句返回一次。虽然await表达式将新值带入协程,但这些值来自被调用者,而不是调用者,并且等待的调用每次都从头开始计算,而不是从它停止的地方计算。有没有办法从中断处恢复返回的协程并可能发送新值?我如何模仿DavidBeazley的CuriousCou