为什么Python的GIL强制执行严格的处理顺序?

tkr*_*man 1 python multithreading gil python-multithreading python-3.x

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()
Run Code Online (Sandbox Code Playgroud)

使用python3运行:

1
2
3
4
5
6
7
8
9
0
Run Code Online (Sandbox Code Playgroud)

总是一样.

现在我希望你让我正确 - 我不一定希望重新安排这些任务,但我只是想知道为什么排序会发生?我的意思是,人们可以期望在一个线程内以确定的方式完成任务,但线程的严格排队对我来说似乎有些奇怪.

无论如何,我如何在Python 3中获得真正的并发?(据我所知,Jython和IronPython只支持2.x).

Mar*_*ers 5

所有作业提交之前都会执行,并且它们都不会写入输出流.你提交调用每个的结果lambda.

即使你使用过:

producersPool.submit(lambda i: print(i), (i,))
Run Code Online (Sandbox Code Playgroud)

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