【问题标题】:deferToThread vs Deferred()deferToThread 与 Deferred()
【发布时间】:2014-03-19 23:47:54
【问题描述】:

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

片段#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 混合的标准输出

SNIPPER#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()

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

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

【问题讨论】:

    标签: python-2.7 twisted deferred twisted.internet


    【解决方案1】:

    你的理解没问题。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我关心的是 deferToThread 函数是否允许你并行运行多个线程?
      • deferToThread 使用标准库 threading 模块。线程的行为与 Python 中线程的行为完全相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多