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

标签 python multithreading wxpython multiprocessing nonblocking

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,那么您可能希望启动一个进程来处理它。

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

关于python - wxPython 非阻塞 GUI 线程和多处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935515/

相关文章:

python - wx.lib.pubsub : How to change the value in a timer

python-2.7 - 在 python 中的单独窗口中读取命令提示符输出

python - Macintosh wxPython EVT_TASKBAR_LEFT_UP 或替代

python - django-social-auth 使用 Google OpenID 给出 502 错误,但只有少数用户

multithreading - node.js 应用程序中单进程中的多线程 socket.io

c# - ConfigureAwait(false) 维护线程身份验证,但默认情况下它不会

multithreading - `_dispatch_barrier_sync_f_invoke`和 `_dispatch_barrier_sync_f_slow`有什么作用?

python - 如何创建 Python 命名空间(argparse.parse_args 值)?

python - numpy 设置值与另一个多维数组作为索引

python - CherryPy SSL 链式证书