我已经阅读了有关该主题的所有文档,但似乎我无法很好地掌握 Python 协程的整个概念来实现我想做的事情。
我有一个后台任务(它会生成一些随机文件,但这并不重要),它在无限循环中执行此操作(这是一个观察者)。
我想以最有效的方式实现这个后台任务,我认为微线程(又名协程)是实现这一目标的好方法,但我根本无法让它工作(无论是后台任务运行或程序的其余部分,但不能同时进行!)。
有人可以给我一个使用协程实现的后台任务的简单示例吗?还是我认为协程可以用于此目的是错误的?
我正在使用 Python 2.7 原生协程。
我精通并发,尤其是 DBMSes 和 Ada,所以我对底层原理了解很多,但我不习惯生成器即协程的概念,这对我来说很新。
/编辑:这是我的代码示例,我必须再次强调它不起作用:
@coroutine
def someroutine():
with open('test.txt', 'a') as f:
f.write('A')
while True:
pass
yield 0
@coroutine
def spawnCoroutine():
result = yield someroutine()
yield result
routine = spawnCoroutine()
print 'I am working in parallel!'
# Save 'A' in the file test.txt, but does not output 'I am working in parallel!'
注意:@coroutine 是来自coroutine.py的装饰器,由 David Beazley 提供
/最终编辑和解决方案回顾
好的,我的问题被关闭了,因为它看起来模棱两可,事实上,这正是我的问题的目的:澄清协程在线程和多处理上的使用。
幸运的是,在可怕的制裁发生之前提交了一个很好的答案!
强调上述问题的答案:不,Python 的协程(也不是 bluelet/greenlet)不能用于运行独立的、可能无限受 CPU 限制的任务,因为协程没有并行性。
这是最让我困惑的。事实上,并行性是并发的一个子集,因此当前 Python 中的协程实现允许并发任务,但不允许并行任务,这相当令人困惑!这种行为要与 Ada 等并发编程语言的 Tasks 概念明确区分开来。
此外,Python 的线程与协程类似,它们通常在等待 I/O 时切换上下文,因此也不是独立 CPU 密集型任务的理想选择(请参阅 David Beazley 的理解 GIL)。
我目前使用的解决方案是使用multiprocessing
模块生成子进程。产生后台进程很繁重,但总比什么都不运行要好。这还具有允许分布式计算的优点。
作为替代方案,在 Google App Engine 上,有deferred 模块和background_thread 模块可以为多处理提供有趣的替代方案(例如,通过使用一些实现 Google App Engine API 的库,例如typhoonae,虽然我不确定他们还没有实现这些模块)。