如何防止线程模块降低Python中程序的性能?
当我在我的Tkinter,Python程序上单击一个按钮时,这个按钮会冻结,我将无法在程序上执行任何其他操作。按钮的实际命令仍然有效,但整个程序的功能消失了。为了解决这个问题,我实现了线程,从而解决了这个问题。但在我实现线程化之后,程序的性能大大降低了 有人知道这是什么原因吗?我怎样才能修好它 编辑-----------------------------------------编辑 这就是我在使用多处理模块而不是线程模块时试图做的如何防止线程模块降低Python中程序的性能?,python,multithreading,tkinter,Python,Multithreading,Tkinter,当我在我的Tkinter,Python程序上单击一个按钮时,这个按钮会冻结,我将无法在程序上执行任何其他操作。按钮的实际命令仍然有效,但整个程序的功能消失了。为了解决这个问题,我实现了线程,从而解决了这个问题。但在我实现线程化之后,程序的性能大大降低了 有人知道这是什么原因吗?我怎样才能修好它 编辑-----------------------------------------编辑 这就是我在使用多处理模块而不是线程模块时试图做的 from multiprocessing import Pro
from multiprocessing import Process
def InitPlaylist(self):
#code here
def PlayPlaylist(self):
p = Process(target = InitPlaylist)
p.start()
p.join()
在没有看到代码的情况下很难确定,但性能下降的最可能原因是,或GIL。Python解释器不是线程安全的,因此它使用GIL来保护自己,防止并发问题引起的错误和崩溃。锁只允许单个线程一次实际执行Python指令,这意味着您无法像在其他无GIL语言中那样在CPU核之间获得真正的并行性。实际上,一个线程执行一段时间,它被挂起,然后另一个线程可以启动,然后它被挂起,等等。您仍然可以获得并发性,但不是真正的并行性
解决此问题的最常见方法是使用模块,而不是
线程化。多处理
利用进程而不是线程进行并发,从而避免了GIL的限制。不过,这也有一些缺点,因为在进程之间共享状态比在线程之间共享状态更困难,开销也更大。很难说没有实际看到代码,但性能下降的最可能原因是,或GIL。Python解释器不是线程安全的,因此它使用GIL来保护自己,防止并发问题引起的错误和崩溃。锁只允许单个线程一次实际执行Python指令,这意味着您无法像在其他无GIL语言中那样在CPU核之间获得真正的并行性。实际上,一个线程执行一段时间,它被挂起,然后另一个线程可以启动,然后它被挂起,等等。您仍然可以获得并发性,但不是真正的并行性
解决此问题的最常见方法是使用模块,而不是线程化。多处理
利用进程而不是线程进行并发,从而避免了GIL的限制。不过,这也有一些缺点,因为在进程之间共享状态比在线程之间共享状态更困难,开销也更大。很难说没有实际看到代码,但性能下降的最可能原因是,或GIL。Python解释器不是线程安全的,因此它使用GIL来保护自己,防止并发问题引起的错误和崩溃。锁只允许单个线程一次实际执行Python指令,这意味着您无法像在其他无GIL语言中那样在CPU核之间获得真正的并行性。实际上,一个线程执行一段时间,它被挂起,然后另一个线程可以启动,然后它被挂起,等等。您仍然可以获得并发性,但不是真正的并行性
解决此问题的最常见方法是使用模块,而不是线程化。多处理
利用进程而不是线程进行并发,从而避免了GIL的限制。不过,这也有一些缺点,因为在进程之间共享状态比在线程之间共享状态更困难,开销也更大。很难说没有实际看到代码,但性能下降的最可能原因是,或GIL。Python解释器不是线程安全的,因此它使用GIL来保护自己,防止并发问题引起的错误和崩溃。锁只允许单个线程一次实际执行Python指令,这意味着您无法像在其他无GIL语言中那样在CPU核之间获得真正的并行性。实际上,一个线程执行一段时间,它被挂起,然后另一个线程可以启动,然后它被挂起,等等。您仍然可以获得并发性,但不是真正的并行性
解决此问题的最常见方法是使用模块,而不是线程化。多处理
利用进程而不是线程进行并发,从而避免了GIL的限制。不过,这也有一些缺点,因为在进程之间共享状态比在线程之间共享状态更困难,开销也更大。最近添加的一些异步功能呢?(,例如。)@jpmc26 async库提供的结果与线程基本相同(不实际使用线程),它们允许您在i/o绑定操作等待时回收处理时间。我尝试使用多处理模块,但当我使用该模块时,它实际上会在程序启动后冻结程序。我将编辑我的原始帖子,以显示我在尝试使用多处理时所执行的操作的代码,或者至少是伪代码,因为程序很长。@Hunter它是冻结的,因为您正在调用p.join()
,这将使主进程阻塞,直到子进程退出。只需调用p.start()。CPU绑定的操作仍然需要多处理
来实现并行性,或者需要一个可以在计算过程中安全释放GIL的C扩展(例如numpy
),那么最近添加的一些异步功能呢?(,例如。)@jpmc26异步库提供的结果与线程基本相同(没有实际使用线程),它们允许您回收处理时间