在扭曲状态下并行运行长阻塞计算

时间:2019-06-21 03:41:45

标签: python twisted twisted.internet

我正在尝试学习扭曲的框架。但是,我无法解决这个问题。

说,我有这个功能。

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

我找到了以下示例:Periodically call deferToThread 但是,我不确定这是否可以并行运行吗?

1 个答案:

答案 0 :(得分:2)

deferToThread使用Python的内置线程支持在单独的线程(来自线程池)中运行传递给它的函数。

因此,deferToThread具有与内置线程模块相同的所有属性。在CPython上,只要其中一个线程持有全局解释器锁,线程就可以并行运行。

由于没有导致“阻塞”的普遍原因,因此也没有针对“阻塞”的普遍的解决方案-因此,无法说出deferToThread是否会导致并行执行一般来说。但是,一般的经验法则是,如果阻塞来自I / O,则可能会发生,如果阻塞来自计算,则可能不会。

当然,如果它来自I / O,则最好使用Twisted的其他功能代替多线程。