python 锁和线程并发
Python中出现线程锁和并发性的问题主要是由于全局解释器锁(Global Interpreter Lock,GIL)的存在。大多数Python实现都有GIL,它在很大程度上消除了使用线程的优势。如果使用线程等待IO操作,可以通过使用异步IO来获得相同或更好的性能。如果使用线程进行计算(数值计算)跨处理器,由于Python全局锁的限制,线程无法正常工作,此时最好使用多进程。
与没有优势相比,Python中的线程存在许多缺点和注意事项,正如你已经发现的那样。您仍然需要进行数据共享控制,并处理与线程在您无法控制的时刻接收CPU注意力相关的奇怪问题。所有这些都没有任何好处。
总之,不要使用线程。
感谢您的回答,总结起来就是尽量使用多进程而不是线程,因为这样可以避开对GIL的要求,是吗?
是的,如果需要多核数值计算,那么可以使用多进程。如果需要等待输入/输出,则只需在单个线程/进程中使用异步IO即可。
线程并不是毫无好处。当您需要在任务之间共享大量状态时,请使用线程。当您不需要共享状态并且派生进程的开销很高时(例如,当您需要在进程之间共享许多KB的状态时),请使用多进程。这里有一个由Python核心贡献者制作的很棒的视频(youtube.com/watch?v=Bv25Dwe84g0)。在创建线程后,您需要小心避免派生进程。我认为数值计算通常发生在GIL之外(C库在执行处理时应该会释放GIL)。