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/