gpt4 book ai didi

用于并发的 python 生成器

转载 作者:行者123 更新时间:2023-12-01 05:13:25 27 4
gpt4 key购买 nike

我正在关注 Python 大师 David Beazley 的幻灯片。它指出“生成器也用于并发。这是一个示例:

from collections import deque

def countdown(n):
while n > 0:
print("T-minus", n)
yield
n -=1

def countup(n):
x = 0
while x > n:
print("Up we go", x)
yield
x +=1

# instantiate some tasks in a queue
tasks = deque([countdown(10),
countdown(5),
countup(20)
])

# run a little scheduler
while tasks:
t = tasks.pop() # get a task
try:
next(t) # run it until it yields
tasks.appendleft(t) # reschedule
except StopIteration:
pass

这是输出:

T-minus 5
T-minus 10
T-minus 4
T-minus 9
T-minus 3
T-minus 8
T-minus 2
T-minus 7
T-minus 1
T-minus 6
T-minus 5
T-minus 4
T-minus 3
T-minus 2
T-minus 1

问题是生成器是如何引入并发的以及它是如何体现的?

最佳答案

这段代码实现了“绿色线程”、协作式、用户态(与抢占式、内核相对)线程的概念。

“线程”是生成器,每个函数都有 yeildyield from在里面。显然,调度程序位于 if __name__ == '__main__': 内。一点。

所以,让我们假设我们没有生成器,而是常规列表,并且每个列表中都有一系列函数。

def doThis(): pass
def sayThis(): pass
def doThat(): pass
...

myThread = [doThis, doThat, doAnother]
yourThread = [sayThis, sayThat, sayAnother]

我们可以按顺序运行所有函数:

for thread in [myThread, yourThread]:
for stmt in thread:
stmt()

或者我们可以按其他顺序执行它们:

for myStmt, yourStmt in zip(myThread, yourThread):
myStmt()
yourStmt()

在第一个“调度程序”中,我们耗尽第一个线程,然后继续处理第二个线程。在第二个调度程序中,我们将语句从两个线程中交错出来,首先是我的,然后是你的,然后回到我的。

因为我们在耗尽这些线程之前在多个“线程”之间交错“语句”,所以我们可以说第二个调度程序提供了并发性。

请注意,并发并不一定意味着并行。它不是同时执行,只是重叠。

关于用于并发的 python 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704799/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com