5

我想了解以下 2 个代码片段会发生什么 -

片段#1

from twisted.internet import threads, defer, reactor

def proc1(a):
    while True:
        print "Proc----------1"

def proc2(a):
    while True:
        print "Proc----------2"

def proc3(a):
    while True:
        print "Proc----------3"

d1 = threads.deferToThread(proc1)
d2 = threads.deferToThread(proc2)
d3 = threads.deferToThread(proc3)

reactor.run()

我的理解是所有线程并行运行,输出是 => 所有 procs 混合的标准输出

狙击手#2

from twisted.internet import threads, defer, reactor

def proc1(a):
    while True:
        print "Proc----------1"

def proc2(a):
    while True:
        print "Proc----------2"

def proc3(a):
    while True:
        print "Proc----------3"



d1 = defer.Deferred()
d2 = defer.Deferred()
d3 = defer.Deferred()

d1.addCallback(proc1)
d2.addCallback(proc2)
d3.addCallback(proc3)

d1.callback('a')
d2.callback('a')
d3.callback('a')

reactor.run()

对于这个片段 - 每个延迟回调一个接一个地触发,就输出而言,只有 proc1 标准输出会无限期地倾泻而出。

如果我错了,请纠正我。所以基本上我想理解和确认的是延迟对象一个接一个地被触发,而 deferToThread 是并行运行的,就像线程一样。

4

2 回答 2

5

如果我错了,请纠正我。所以基本上我想理解和确认的是延迟对象一个接一个地被触发,而 deferToThread 是并行运行的,就像线程一样。

这并不完全正确,但它有点接近。这是触发延迟的代码:

d1.callback('a')
d2.callback('a')
d3.callback('a')

你一个接一个地触发了它们。这没有什么特别或神秘的。这就是 Python 的工作方式。

延迟与线程没有任何关系。它们不会自动使代码成为非阻塞、异步或多线程的。他们只是保留一个函数列表(您使用该方法添加到该列表中addCallback),然后调用该列表中的函数(当您使用该callback方法时)。

于 2014-02-19T16:53:54.153 回答
1

你的理解没问题。

Snippet 1 将同时运行所有程序(每个程序在自己的线程中)。这三个过程必须是线程安全的。

Snippet 2 将在反应器线程中一个接一个地运行程序。只有当一个过程完成时,反应器线程才会传递到下一个延迟,并开始执行下一个过程。

如果其中一个deferred 是twisted 的一部分,比如说通过网络访问某些东西,当它阻塞时,reactor 将移动到它拥有的下一个未阻塞的deferred,并最终在它解除阻塞后的某个时间拾取阻塞的一个。

您不必担心您的一个进程会干扰另一个进程(前提是您没有其他代码调用它们或多个反应器调用它们)

于 2014-08-21T15:45:06.847 回答