Tag: 协程

从Python中的“with”块(以及为什么)产生安全吗?

协程和资源获取的结合似乎可能会带来一些意想不到的(或不直观的)后果。 基本的问题是这样的事情是否有效: def coroutine(): with open(path, 'r') as fh: for line in fh: yield line 它做的。 (你可以testing它!) 更深层次的问题是,应该是finally的替代scheme,在那里确保资源在块的末尾被释放。 协程可以暂停和恢复执行,那么冲突是如何解决的呢? 例如,如果在协程尚未返回的情况下,在协同程序内部和外部使用读/写打开文件: def coroutine(): with open('test.txt', 'rw+') as fh: for line in fh: yield line a = coroutine() assert a.next() # Open the filehandle inside the coroutine first. with open('test.txt', 'rw+') as fh: # Then open it […]

如何在Python 3.5中使用async / await?

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time async def foo(): await time.sleep(1) foo() 我不能让这个简单的例子来运行: RuntimeWarning: coroutine 'foo' was never awaited foo()

生产中可以使用“实验”Kotlin协同程序吗?

Kotlin协同程序可以在生产中使用吗?他们的实验状态是什么意思?

协程的用例是什么?

协程的概念听起来很有趣,但我不知道,如果在真实的生产环境中有意义, 什么是协程的用例,可以像其他方法那样解决更优雅,更简单或更高效的问题?

Java中可用的协程库

我想在Java中做一些东西,如果使用并发例程编写的话会更清楚,但是对于哪些完整的线程严重矫枉过正。 答案当然是使用协同程序 ,但在标准的Java库中似乎没有任何协程支持,并且它上面的一个快速的Google带来了诱人的提示,但没有任何实质性的提示。 这是我到目前为止发现的: JSIM有一个协程类,但它看起来相当重量级,似乎与线程的点。 这一点是为了减less全线程的复杂性,而不是增加它。 此外,我不确定该类可以从库中提取和独立使用。 Xalan有一个协程类集,它可以做类似协程的东西,但是如果能从整个图书馆中有意义地抽取出来的话,这个问题也是可疑的。 它看起来像是作为线程池的严格控制forms实现的,而不是实际的协程。 有一个谷歌代码项目 ,看起来像我之后,但如果有什么看起来比使用线程更重量级。 我基本上很紧张,需要软件在运行时dynamic地改变JVM字节码来完成它的工作。 这看起来像是矫枉过正,就像一些会比协同程序解决更多问题的东西。 而且看起来它并没有实现整个协程的概念。 通过我的浏览,它提供了一个返回给调用者的yield特性。 正确的协程允许yields直接将控制转移到任何已知的协程。 基本上这个库,重量级和可怕的,只是给你支持迭代器,而不是完全一般的协程。 这个名为Coroutine的Java失败了,因为它是一个特定于平台(显然使用JNI)的解决scheme。 这就是我发现的一切。 我知道Da Vinci机器上的原生JVM对协程的支持,我也知道JNI的延续技巧 。 但是,这些对我来说并不是很好的解决scheme,因为我不一定能控制我的代码运行在哪个虚拟机或平台上。 (事实上​​,任何字节码操作系统都会遇到类似的问题 – 如果可能的话,最好是纯Java。运行时字节码操作会限制我在Android上使用它)。 那么有没有人有指点? 这甚至有可能吗? 如果没有,Java 7中可能吗? 编辑添加: 只是为了确保混淆,这是我的另一个 相关问题,但不是相同的。 这是寻求一个现有的实施,以避免不必要的重新发明车轮。 另一个是关于如何在Java中执行协程的问题,如果这个问题certificate是无法回答的话。 目的是在不同的线程上保留不同的问题。 进一步编辑添加: 答案被选中 。 但是,一些评论是为了。 图书馆指出不是一个协同程序库,所以它在技术上不能回答我的问题。 这就是说,但它有两个优势链接到上面的Google Code项目: 两种解决scheme都使用字节码操作,但所选库允许静态字节码操作,这使得它可用于Android和其他不兼容的JVM堆栈。 Google Code项目不会执行完整的协程。 虽然答案的库甚至不做协程,但是它更重要:它为我自己的全function协程提供了一个很好的基础工具。

在Python中有一种方法来检查一个函数是否是一个“生成器函数”之前调用它?

可以说我有两个function: def foo(): return 'foo' def bar(): yield 'bar' 第一个是正常的function,第二个是发电机function。 现在我想写这样的东西: def run(func): if is_generator_function(func): gen = func() gen.next() #… run the generator … else: func() 什么是is_generator_function()的简单实现? 使用types包我可以testinggen是否是一个生成器,但是我希望在调用func()之前这样做。 现在考虑下面的情况: def goo(): if False: yield else: return 调用goo()将返回一个生成器。 我认为pythonparsing器知道goo()函数有一个yield语句,我想知道是否可以轻松地获取这些信息。 谢谢!

用Java实现协程

这个问题与我在Java中的现有协程实现的问题有关。 如果我猜想,现在没有完全实现Java中现有的协程,那么实现它们需要什么? 正如我在这个问题中所说的,我知道以下几点: 你可以在后台实现“协程”作为线程/线程池。 您可以在后台使用JVM字节码做一些棘手的事情,以使协程成为可能。 所谓的“达芬奇机器”JVM实现具有原语,使得协程可以不用字节码操作。 有许多基于JNI的协程也是可能的。 我将依次解决每个人的缺陷。 基于线程的协程 这个“解决scheme”是病态的。 协程的整个目的是避免线程,locking,内核调度等开销。协程应该是轻而快的,只能在用户空间中执行。 在全倾斜线程严格限制的条件下实现它们,摆脱了所有的优点。 JVM字节码操作 这个解决scheme更实用,虽然有点难以实现。 这与C语言中的协程库(这是其中的多less个工作)跳到汇编语言中大致相同,其优点是只有一个架构需要担心和正确。 它还将您绑定到只在完全兼容的JVM堆栈上运行代码(这意味着,例如,没有Android),除非您可以find一种方法在不兼容的堆栈上执行相同的操作。 但是,如果您确实find了一种方法,那么您的系统复杂性和testing需求已经翻了一番。 达芬奇机器 达芬奇机器对于实验来说是很酷的,但是由于它不是一个标准的JVM,它的function在任何地方都不可能实现。 实际上我怀疑大多数生产环境都会特别禁止使用达芬奇机器。 因此,我可以用这个来做一些很酷的实验,但是不能用于我想要发布到真实世界的任何代码。 这也有类似上面的JVM字节码操作解决scheme的附加问题:不会在替代堆栈(如Android的)上工作。 JNI的实现 这个解决scheme使得在Java中这样做是毫无意义的。 CPU和操作系统的每个组合都需要独立testing,每个组合都有可能使微妙的失败成为可能。 另外,当然,我可以把自己完全绑定到一个平台上,但是这也使得Java中的事情完全没有意义。 所以… 有没有什么办法可以在没有使用这四种技术的Java中实现协程? 或者我会被迫使用那些味道最less的四个之一(JVM操作)呢? 编辑添加: 只是为了确保混淆,这是我的另一个 相关问题,但不是相同的。 那个正在寻找一个现有的实施,以避免不必要的重新发明车轮。 这个问题涉及到如果另一个certificate是无法回答的,那么如何去执行Java中的协程。 目的是在不同的线程上保留不同的问题。

等价的C ++到Python生成器模式

我有一些Python代码,我需要在C ++中模仿。 我不需要任何特定的解决scheme(比如基于协同例程的良率解决scheme,尽pipe它们也是可以接受的答案),但我只需要以某种方式重现语义。 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 ++中我唯一可以find的解决scheme是用C ++协程来模仿yield ,但是我没有find关于如何做这个的好的参考。 我也对这个问题的替代(非一般)解决scheme感兴趣。 我没有足够的内存预算来保留传递之间的序列副本。

StartCoroutine / yield返回模式在Unity中是如何工作的?

我了解协程的原理。 我知道如何让标准的StartCoroutine / yield return模式在Unity中的C#中工作,例如调用一个通过StartCoroutine返回IEnumerator的方法,并在该方法中做一些事情,确保yield return new WaitForSeconds(1); 等一下,然后做点别的。 我的问题是:幕后究竟发生了什么? StartCoroutine究竟做了什么? 什么IEnumerator是WaitForSeconds返回? StartCoroutine如何将控制返回到被调用方法的“其他”部分? 所有这些与Unity的并发模型(没有使用协同程序的同时发生的事情很多)是如何交互的?

协程与持续vs发电机

协程和延续与发生器有什么区别?