Skip to main content
 首页 » 编程设计

python之wxPython 非阻塞 GUI 线程和多处理

2025年05月04日30me-sa

python 2.7.3 x64 wxPython 2.8 x64

阅读了很多关于 python 线程和多处理的文章,尤其是 Doug Hellmann 的一些文章,这些文章提供了极大的帮助。但是,我对一件事感到困惑......

我认为 Python 多处理模块或多或少是线程模块的直接替代品,除了 args 必须是 picklable,但我发现为了不阻塞在我的 GUI 中,我必须首先使用 threading.Thread 创建一个新线程,然后使用 multiprocessing.Process 在该线程中创建多进程。这很有效,而且效果很好,但对我来说似乎有点笨拙。

如果我尝试在没有第一个线程的情况下直接进行多处理,那么我的 GUI 仍然会阻塞,直到多处理作业完成。这是按设计工作的,还是我遗漏了有关多处理模块的一些基本知识?

如果需要示例,我可以提供。

谢谢,

-RMW混沌

需要一个例子...

假设 onProcess() 由 GUI 中的按钮触发,这会阻止 GUI...

import time 
import multiprocessing as mp 
 
def myWorker(a, b): 
    time.sleep(0.1) 
    print '{} * {} = {}'.format(a, b, a*b) 
 
def onProcess(event): 
    jobs = mp.cpu_count() * 2 
    a = 5 
    b = 10 
 
    for job in range(jobs): 
        mp.Process(target = myWorker, args = (a, b,)).start() 

虽然这不是...

import time 
import multiprocessing as mp 
import threading as th 
 
def myWorker(a, b): 
    time.sleep(0.1) 
    print '{} * {} = {}'.format(a, b, a*b) 
 
def onProcess(event): 
    a = 5 
    b = 10 
    th.Thread(target = myThread, args = [a, b,]).start() 
 
def myThread(a, b): 
    jobs = mp.cpu_count() * 2 
 
    for job in range(jobs): 
        mp.Process(target = myWorker, args = (a, b,)).start() 

请您参考如下方法:

多线程和多处理是根本不同的。

线程大部分用于 I/O。当您创建一个新线程时,它包含在与您生成线程的程序相同的进程中。这意味着它与程序共享内存空间,但它们(程序和线程)不能并行运行(还要查找 GIL)。

另一方面,多处理会在操作系统级别产生一个新进程。这个新进程可以与先前存在的进程并行运行,但它不与生成它的程序共享内存空间。当您要加速的代码与 i/o 无关,而是实际的处理器密集型计算时,这会更有用。

对于 gui,您主要希望对 gui 的不同部分使用线程,以便在 gui 的一部分中运行某些东西不会锁定整个 gui,直到该处理结束。

没有代码很难说,但我相信你不应该特别需要在新线程中生成一个进程,而是让那个线程处理处理。但是,如果该线程需要处理密集型计算类型的处理而不是大量的 i/o,那么您可能希望启动一个进程来处理它。

我相信您的大部分问题在于对多处理与多线程的误解。