【发布时间】:2018-03-19 19:47:13
【问题描述】:
我在网上找到的每一个结果要么非常老,特定于 Python 2.7 或 3.x,要么太复杂以至于我无法理解。我的用例非常简单,但我很难找到一个简单的解决方案。我现有的代码如下所示:
return_val = func_that_makes_a_request(val1, val2)
lots = "of"
other()
code()
foo = some_other_func_that_makes_a_request(val3, val4)
something_else(foo, return_val)
第一行结束发出 HTTP 请求。接下来的几行计算一些值,然后用于在第 2 到最后一行中发出另一个 HTTP 请求。这两个部分(顶行,除最后一行之外的所有内容)彼此完全独立。最后一行需要两者的结果。
我真正想要的是并行发出这两个 HTTP 请求,因为两者都不需要等待另一个。在 Python 2.7+ 中工作的最简单方法是什么?
为未来的读者编辑 使用这个解决方案:
with multiprocessing.dummy.Pool(1) as thread_pool:
return_async = thread_pool.apply_async(func_that_makes_a_request, (val1, val2))
lots = "of"
other()
code()
foo = some_other_func_that_makes_a_request(val3, val4)
return_val = return_async.get()
something_else(foo, return_val)
【问题讨论】:
-
你能要求 Python 2.7 的 PyPI 包吗?如果你愿意
pip install futures,你可以在 2.7 和 3.x 中使用它。 -
我可以,但如果有其他几乎相同的选项,那就更好了。
-
或者,裸
threading模块和multiprocessing.dummy都适用于两个版本(可能有一点six-ing,但您可能想使用six或无论如何都相当于双版本代码)。 -
事实证明,
threading不需要six,因为 2.7 对所有内容都有旧式和新式名称。但是在任何严肃的项目中,你都会一次或一次遇到一些你想要导入 ElementTree 或需要一个可迭代的惰性字典键或其他东西的东西,它的拼写有点不同,six(或modernize, 如果你是围绕2to3构建的) 会更容易。 -
暂别我在这里所说的,我看到你正在主线程中执行第二个任务,所以
Pool(1)工作正常。
标签: python multithreading python-3.x python-2.7