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。)
答案 0 :(得分:5)
所有作业在提交之前都会执行,并且它们都不会写入输出流。您提交了调用每个lambda
的结果。
即使您使用了:
producersPool.submit(lambda i: print(i), (i,))
每个线程中没有足够的被另一个线程抢占,因此它们都可以在任何其他线程之前完成。
答案 1 :(得分:2)
回答你问题的第二部分:
“如何在Python 3中获得真正的并发性?”
您可以使用multiprocessing模块:
“multiprocessing是一个支持使用的生成进程的包 类似于线程模块的API。多处理包 提供本地和远程并发,有效地侧面步进 全局解释器使用子进程而不是线程锁定。“
由于您的示例使用ThreadPoolExecutor
中的concurrent.futures
,请查看同一个包中的ProcessPoolExecutor
。它类似于ThreadPoolExecutor
,但使用进程(而不是线程),因此它不会受到GIL的阻碍。