Python的2.7.3 64 wxPython的2.8 x64的
在阅读关于Python线程和多,特别是一些由道格·海尔曼,已经极大地帮助文章颇有几分。 不过,我很困惑的一件事...
我认为 Python的多模块更或多或少的下降,在更换为线程模块,除此之外,ARGS必须picklable,但我发现,为了不挡住我的GUI,我必须首先创建一个新的线程与threading.Thread然后用multiprocessing.Process该线程中多进程。 这工作,并且效果很好,但似乎有点kludgey给我。
如果我尝试直接多进程不先穿,然后我的GUI仍阻止,直到多任务已经完成。 是事先设计好的,还是我失去了一些关于多模块的根本?
如果需要的例子,我可以为他们提供。
谢谢,
-RMWChaos
请求一个例子...
假设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,直到处理结束。
如果没有代码是很难说,但我相信你不应该特别需要在新的线程中生成一个进程,而只是有一个线程处理的处理。 但是,如果线程需要处理密集计算类型的处理,而不是大量的I / O,那么你将要启动一个进程来处理。
我相信,大部分的问题就在于误解多处理多线程VS。
我试图运行你的代码在下面的测试程序和多工作正常,没有什么阻止:
import time
import multiprocessing as mp
import wx
def myWorker(a, b):
time.sleep(10)
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()
def onGUI(event):
print 'GUI is not blocked'
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
buttons = []
panel = wx.Panel(self, wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
gui_proc_btn = wx.Button(panel, wx.ID_ANY, 'GUI Process')
other_proc_btn = wx.Button(panel, wx.ID_ANY, 'Other process')
gui_proc_btn.Bind(wx.EVT_BUTTON, onGUI)
sizer.Add(gui_proc_btn, 0, wx.ALL, 5)
other_proc_btn.Bind(wx.EVT_BUTTON, onProcess)
sizer.Add(other_proc_btn, 0, wx.ALL, 5)
panel.SetSizer(sizer)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'test.py')
frame.Show(True)
self.SetTopWindow(frame)
return True
if __name__ == '__main__':
app = MyApp(0)
app.MainLoop()
从您的命令行运行它,按下第二个按钮(这使用multiprocessing
关于你的函数,我增加了睡眠时间),然后按下第一个按钮。 你应该注意到有按下第一个按钮时,所以程序不会被阻止生成的输出。