如何防止线程模块降低Python中程序的性能?

如何防止线程模块降低Python中程序的性能?,python,multithreading,tkinter,Python,Multithreading,Tkinter,当我在我的Tkinter,Python程序上单击一个按钮时,这个按钮会冻结,我将无法在程序上执行任何其他操作。按钮的实际命令仍然有效,但整个程序的功能消失了。为了解决这个问题,我实现了线程,从而解决了这个问题。但在我实现线程化之后,程序的性能大大降低了 有人知道这是什么原因吗?我怎样才能修好它 编辑-----------------------------------------编辑 这就是我在使用多处理模块而不是线程模块时试图做的 from multiprocessing import Pro

当我在我的Tkinter,Python程序上单击一个按钮时,这个按钮会冻结,我将无法在程序上执行任何其他操作。按钮的实际命令仍然有效,但整个程序的功能消失了。为了解决这个问题,我实现了线程,从而解决了这个问题。但在我实现线程化之后,程序的性能大大降低了

有人知道这是什么原因吗?我怎样才能修好它

编辑-----------------------------------------编辑

这就是我在使用多处理模块而不是线程模块时试图做的

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异步库提供的结果与线程基本相同(没有实际使用线程),它们允许您回收处理时间