【问题标题】:Running long blocking calculations in parallel in twisted以扭曲的方式并行运行长阻塞计算
【发布时间】:2019-06-21 03:41:45
【问题描述】:

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

说,我有这个功能。

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 但是,我不确定这是否是并行运行的?

【问题讨论】:

  • 从多处理导入过程中使用 p1 = Process(target=long_blocking_call, args, name='k') p1.start() p2 = Process(target=long_blocking_call, args, name='k') p2.start() p1.join() p2.join() 这不是一个正确的代码,只是进一步谷歌它,不要使用 args 因为它是一个关键字
  • @MadhurYadav 你能在答案中格式化吗?
  • 多处理模块与 Twisted 无关。如果问题是关于如何使用多个进程来实现并行计算,这是一个可能的答案。如果问题是关于如何使用 Twisted 进行并行计算,那不是。

标签: python twisted twisted.internet


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回答.. 那么.. 在扭曲的世界中并行化上述long_blocking_call 函数的好方法是什么?
  • 这个一个?它可以很好地并行化,因为 time.sleep 释放了 GIL。或者你可以使用 reactor.callLater 而不是 time.sleep。但是您真的对并行化大部分基于睡眠的系统时钟函数感兴趣吗?
  • 啊.. 不.. 基本上.. 把 sleep 想象成另一个函数调用... 它做的事情需要几秒钟来处理.. 我想要实现的是有一个for 循环.. 然后.. for 循环的每个成员调用另一个函数,该函数可以独立处理 for 循环中的其他成员.. 本质上.. 就像pool.map(long_blocking_call, for_loop_list) 但是,我知道扭曲和多处理库不玩好吧..我猜 deferToThread 能够独立运行..但我不太确定..你能指导/建议吗?
  • 请重新阅读我关于“没有普遍的阻塞原因”的答案部分。而且我会编辑更多的词来使那部分更加明确。
  • 我猜.. 我想问的是.. 是否有相当于 asyncio create_task 的扭曲? asyncio.readthedocs.io/en/latest/hello_world.html
猜你喜欢
  • 2023-04-08
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多