运行 twisted 并行长阻塞计算

Running long blocking calculations in parallel in twisted

我正在尝试学习扭曲的框架。但是,我无法掌握它。

说,我有这个功能

def long_blocking_call(arg1, arg2):
     # do something
     time.sleep(5) # simulate blocking call
     return result

results = []
for k, v in args.iteritems():
      r = long_blocking_call(k,v)
      results.append(r)

但是,我想知道如何利用 deferToThread(或扭曲世界中的其他东西)来 运行 long_blocking_call in "parallel"

我找到了这个例子: 但是,我不确定这是否是 运行 并行的事情?

deferToThread 使用 Python 的 built-in 线程支持 运行 在单独的线程(从线程池)中传递给它的函数。

所以 deferToThread 在并行性方面具有与 built-in 线程模块相同的所有属性。在 CPython 上,线程可以 运行 并行,只要其中一个线程持有全局解释器锁。

由于 "blocking" 没有普遍的原因,因此 "blocking" 也没有普遍的 解决方案 - 所以没有办法说 deferToThread 通常会导致并行执行或不并行执行。但是,一般的经验法则是,如果阻塞来自 I/O,它可能会,如果它来自计算,则可能不会。

当然,如果它来自 I/O,您最好使用 Twisted 的其他功能而不是多线程。