运行 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 的其他功能而不是多线程。
我正在尝试学习扭曲的框架。但是,我无法掌握它。
说,我有这个功能
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 的其他功能而不是多线程。