python并发生成器
下面是Python大师David Beazley的幻灯片。它声明生成器也用于并发。以下是一个例子:python并发生成器,python,asynchronous,concurrency,generator,Python,Asynchronous,Concurrency,Generator,下面是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)
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
问题是并发是如何由生成器引入的,它是如何体现的?这段代码实现了绿色线程、协作、用户区的概念,而不是抢占式的内核线程 线程是生成器,每个函数都包含yeild或yield。调度程序显然位于if uuu name_uuuu=='uuuu main_uuuu':位中 所以,让我们假设我们没有生成器,而是常规列表,每个列表中都有一系列函数
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()
在第一个调度程序中,我们耗尽第一个线程,然后继续第二个线程。在第二个调度程序中,我们将两个线程中的语句交错,首先是我的,然后是你的,然后返回到我的
这是因为在检查多个线程之前,我们在多个线程之间交错语句,所以我们可以说第二个调度程序提供了并发性
请注意,并发并不一定意味着并行。这不是同时执行,只是重叠。这里有一个例子来说明: 从集合导入deque def coro1: 对于范围1、10中的i: 产量一 def coro2: 对于范围1、10中的i: 收益率i*10 打印“异步行为”。center60, 任务=deque 任务。扩展[coro1,coro2] 而任务: task=tasks.pop左键选择并删除任务coro1/coro2。 尝试: printnexttask tasks.appendtask添加已删除的任务coro1/coro2以进行排列。 除停止迭代外: 通过 输出:
在那个例子中,并发性对我来说是显而易见的。也许问题在于你对并发这个术语的理解?请用外行的术语解释并发,这样我和其他像我这样的人才能更好地理解。我认为这是一个接一个的任务,因为它们被移除,然后放回到队列中。如果你还没有,你可以试试这些幻灯片的PyCon对话:就像另一个问题一样。如果生成器可以帮助实现并发,那么真的需要线程吗?若有,原因为何?若否,原因为何?非常感谢,编程中的许多东西并不是绝对必要的,例如:,但它们很方便,所以我们还是保留它们。
######################Async behaviour#######################
1
10
2
20
3
30
4
40
5
50
6
60
7
70
8
80
9
90