Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python并发生成器_Python_Asynchronous_Concurrency_Generator - Fatal编程技术网

python并发生成器

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)

下面是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

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

这段代码实现了绿色线程、协作、用户区的概念,而不是抢占式的内核线程

线程是生成器,每个函数都包含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