【发布时间】:2013-12-21 16:26:11
【问题描述】:
from concurrent.futures import ThreadPoolExecutor, as_completed
def main():
with ThreadPoolExecutor(max_workers=16) as producersPool:
for i in [1,2,3,4,5,6,7,8,9,0]:
producersPool.submit((lambda i : print(i))(i))
if __name__ == "__main__":
main()
用python3运行:
1
2
3
4
5
6
7
8
9
0
始终如一。
现在我希望您能正确回答我 - 我不一定希望对这些任务进行重新排序,但我只是想知道为什么会发生排序?我的意思是,人们可以期望在一个线程内以确定性的方式完成任务,但是线程的严格排队对我来说似乎有点奇怪。
无论如何,如何在 Python 3 中获得真正的并发性? (据我所知,Jython 和 IronPython 仅支持 2.x)。
【问题讨论】:
-
您的示例包含一个重要错误:您实际上是在 calling lambda 并且仅将 result(始终为 None)传递给 @987654323 @。观察到的行为与 ThreadPool 无关。你可能想改写
(lambda i: (lambda: print(i)))(i)。 -
@l4mpi,是的,我已经注意到了,并且已经打了自己的脸。我将代码编辑为
producersPool.submit(sleepy, i),它按预期运行,即是一种相当出人意料的方式。谢谢。
标签: python multithreading python-3.x python-multithreading gil