1
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)。

4

2 回答 2

5

所有作业都在提交之前执行,并且它们都没有比写入输出流更多的功能。您提交调用 each的结果lambda

即使您使用:

producersPool.submit(lambda i: print(i), (i,))

每个线程中没有足够的东西被另一个线程抢占,所以它们都在任何其他线程可以进入之前完成。

于 2013-12-21T16:28:34.513 回答
2

回答你问题的第二部分:

“如何在 Python 3 中获得真正的并发性?”

您可以使用多处理模块:

“multiprocessing 是一个使用类似于 threading 模块的 API 支持生成进程的包。multiprocessing 包提供本地和远程并发,通过使用子进程而不是线程来有效地避开全局解释器锁。”

由于您的示例使用ThreadPoolExecutorfrom concurrent.futures,请查看ProcessPoolExecutor同一个包中的内容。它类似于ThreadPoolExecutor,但使用进程(而不是线程),因此不受 GIL 的阻碍。

于 2013-12-21T16:44:29.390 回答