我从 Python 中的线程开始,并尝试实现合并排序,在开始时,作业被分成2个线程。我使用collections.deque
,itertools.islice
,threading.Thread
。
我在开头创建了两个线程,它们正常地执行了一半的工作,然后我加入它们并合并结果。但是我注意到它比两个线程更长(几乎是两倍),而不是正常情况下。
这怎么可能? Here is a link to the code,如果需要,我可以在这里重现主要部分(我也在Code Review SE上发布了这个问题,而我还是要保留这个问题)
是否与this问题相关(在 C ++ 中似乎是一个类似的问题)?非常感谢你。
答案 0 :(得分:1)
这怎么可能?
与C ++不同,由于GIL,Python很难并行化。
虽然collections.deque
' append
和popleft
是线程安全的,但这并不能保证它们在非串行范例中表现良好。
是否与此问题有关?
没有。 GIL是CPython的财产。与虚假分享完全不相干。
使用两个线程比使用正常情况时需要更长的时间(几乎是两倍)。
这是因为GIL不支持共享内存多线程。因此,您基本上按顺序两次运行代码。