【发布时间】:2017-09-03 18:15:58
【问题描述】:
首先,理想情况下,以下代码应该同步运行 3 个 greenlets,但它会异步运行所有 3 个 greenlets。然而奇怪的事情是不管你有多少个greenlet,它都会为第二个greenlet启动一个额外的同步过程。我不是在问这个问题的解决方法,只是我想了解这背后的原因。
import gevent
import time
def func(i):
t = time.time()
print('func %s started at %s' % (i, t))
secs = 5
statement = "after %s secs" % secs
gevent.sleep(secs)
print('func %s stopped in %s secs' % (i, (time.time() - t)))
apps = [gevent.Greenlet.spawn(func, i) for i in range(3)]
[app.run() for app in apps]
这是示例标准输出:
func 0 started at 1491859273.2895772
func 1 started at 1491859273.2898045
func 2 started at 1491859273.2899446
func 0 stopped in 5.0095603466033936 secs
func 1 started at 1491859278.2993205
func 1 stopped in 5.0163233280181885 secs
func 2 stopped in 5.019707918167114 secs
func 1 stopped in 5.009198188781738 secs
func 1 started 怎么会出现两次?
【问题讨论】:
-
您能否更明确地说明您实际看到的具体观察结果,以及它们与您的预期有何不同? (对为什么你期望你所做的行为也不会造成伤害的一些解释。
-
从上面的编辑中我的问题更清楚了吗?
-
这很有帮助,因为它清楚地描述了你当前的行为——但仍然缺少解释为什么你期望相反/不同的行为。
-
apps在模块中创建了 3 个 greenlet 对象(任务),但是当它们稍后运行时(run()),它首先使三个任务同时运行,但在第一个任务之后完成它再次运行第二个任务。如果执行了 3 个任务而不是 4 个任务,这似乎更合乎逻辑。