Questions tagged «coroutine»

协程是一种通用的控制结构,流控制在两个不同的例程之间协同传递而不返回。

30
“ yield”关键字有什么作用?
yield关键字在Python中的用途是什么? 例如,我试图理解这段代码1: def _get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild 这是呼叫者: result, candidates = [], [self] while candidates: node = candidates.pop() distance = node._get_dist(obj) if distance <= max_dist and distance >= min_dist: result.extend(node._values) …






4
GreenletVS。线程数
我是gevents和greenlets的新手。我找到了一些有关如何使用它们的很好的文档,但是没有一个文档为我提供有关如何以及何时使用greenlets的理由! 他们真正擅长的是什么? 是否在代理服务器中使用它们是一个好主意吗? 为什么不线程? 我不确定的是,如果它们基本上是例程,它们如何为我们提供并发性。

6
StartCoroutine /收益率返回模式在Unity中如何真正起作用?
我了解协程的原理。我知道如何使标准StartCoroutine/ yield return模式在Unity的C#中工作,例如,调用IEnumerator通过返回的方法,StartCoroutine然后在该方法中执行某项操作yield return new WaitForSeconds(1);,等待一秒钟,然后执行其他操作。 我的问题是:幕后到底发生了什么?什么是StartCoroutine真的?什么IEnumerator是WaitForSeconds恢复?如何StartCoroutine将控制权返回给被调用方法的“其他”部分?所有这些如何与Unity的并发模型(其中不使用协程同时进行很多事情)进行交互?
134 c#  unity3d  coroutine 

12
与Python生成器模式等效的C ++
我有一些需要在C ++中模仿的示例Python代码。我不需要任何特定的解决方案(例如基于协同例程的收益解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义。 蟒蛇 这是一个基本的序列生成器,显然太大了,无法存储实例化版本。 def pair_sequence(): for i in range(2**32): for j in range(2**32): yield (i, j) 目标是维护上述序列的两个实例,并以半锁步的方式在块上进行迭代。在下面的示例中,first_pass使用对的序列来初始化缓冲区,然后second_pass重新生成相同的精确序列并再次处理缓冲区。 def run(): seq1 = pair_sequence() seq2 = pair_sequence() buffer = [0] * 1000 first_pass(seq1, buffer) second_pass(seq2, buffer) ... repeat ... C ++ 对于C ++解决方案,我唯一能找到的就是模仿yieldC ++协程,但是我还没有找到有关如何执行此操作的良好参考。我也对解决此问题的替代(非常规)解决方案感兴趣。我没有足够的内存预算来保留两次通过之间的序列副本。

3
C ++ 20中的协程是什么?
什么是协程 C ++ 20? 它与“ Parallelism2”或/和“ Concurrency2”有何不同(请看下图)? 下图来自ISOCPP。 https://isocpp.org/files/img/wg21-timeline-2017-03.png
104 c++  coroutine  c++20 

4
asyncio.ensure_future与BaseEventLoop.create_task与简单协程?
我看过一些关于asyncio的基本Python 3.5教程,以各种方式进行相同的操作。在此代码中: import asyncio async def doit(i): print("Start %d" % i) await asyncio.sleep(3) print("End %d" % i) return i if __name__ == '__main__': loop = asyncio.get_event_loop() #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)] #futures = [loop.create_task(doit(i)) for i in range(10)] futures = [doit(i) for i in range(10)] result = …


6
暂停单子
Monad可以完成许多令人惊奇的疯狂事情。他们可以创建保存值叠加的变量。它们可以允许您在计算数据之前访问将来的数据。它们可以允许您编写破坏性的更新,但实际上不是。然后,延续monad可以让您大开眼界!通常是您自己的。;-) 但这是一个挑战:您可以制作一个可以暂停的单子吗? 数据暂停sx 实例Monad(Pause) 变异::(s-> s)->暂停s() 产量::暂停s() 步骤:: s->暂停s()->(s,也许(暂停s())) 该Pause单子是一种状态的单子(因此mutate,具有明显的语义)。通常,这样的monad具有某种“运行”功能,该功能运行计算并让您返回最终状态。但是Pause有所不同:它提供了一个step函数,该函数将运行计算直到调用魔术yield函数。在这里,计算被暂停,将足够的信息返回给调用者,以便以后恢复计算。 要获得更大的声望,请执行以下操作:允许呼叫者修改两次呼叫之间的状态step。(例如,上面的类型签名应允许这样做。) 用例:编写执行复杂功能的代码通常很容易,但是使用一个完整的PITA对其进行转换以在其操作中也输出中间状态。如果您希望用户能够在执行过程中进行某些更改,那么事情就会变得非常复杂。 实施思路: 显然,可以使用线程,锁和来完成IO。但是,我们可以做得更好吗?;-) 延续单子的疯狂吗? 也许是某种作家monad,它只yield记录当前状态,然后我们可以step通过遍历日志中的状态来“假装”它。(显然,这排除了在步骤之间更改状态的可能,因为我们现在并没有真正“暂停”任何内容。)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.