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

时间:2013-12-21 16:26:11

标签: python multithreading python-3.x python-multithreading gil

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

2 个答案:

答案 0 :(得分:5)

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

即使您使用了:

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

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

答案 1 :(得分:2)

回答你问题的第二部分:

  

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

您可以使用multiprocessing模块:

  

“multiprocessing是一个支持使用的生成进程的包   类似于线程模块的API。多处理包   提供本地和远程并发,有效地侧面步进   全局解释器使用子进程而不是线程锁定。“

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