繁体   English   中英

如何使用python一次并行处理

[英]How to parallel to processes at a time using python

我先研究了一下,却找不到答案。 我正在尝试使用与wxpython在Python中制作的GUI并行的GUI运行我的另一个程序。 我要强调的def是def“ startsumo”与def“ onSurasakPhase3(event):”平行。 问题是,每当我单击导致定义为“ startsumo”的“ button2”,并且其功能是运行由子进程调用的另一个GUI时,我将无法同时单击bmp按钮。 我所知道的是它是一个顺序程序,我必须找到一种并行而不是串行的方法。 请帮忙。

我有这样的事情:

class top(wx.Frame):

    def __init__(self,parent,id):
    wx.Frame.__init__(self,parent,id,'Frane aka window', size=(500,500))
    panel=wx.Panel(self)
    button=wx.Button(panel,label="exit",pos=(10,10),size=(60,60))
    self.Bind(wx.EVT_BUTTON, self.closebutton, button)
    self.Bind(wx.EVT_CLOSE, self.closewindow)

    button2=wx.Button(panel,label="START_SUMO",pos=(100,10),size=(100,60))
    self.Bind(wx.EVT_BUTTON, self.startsumo, button2)

    def onSurasakPhase3(event):
        print "surasak phase 3 is selected"

    bmp = wx.Bitmap("surasak_phase3.png", wx.BITMAP_TYPE_ANY)
    buttonOnSurasakPhase3 = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
                              size=(bmp.GetWidth(), bmp.GetHeight()))
    buttonOnSurasakPhase3.Bind(wx.EVT_BUTTON, onSurasakPhase3)
    buttonOnSurasakPhase3.SetPosition((2*(bmp.GetWidth())+20,30))


    def startsumo(self,event):
        def run():
            traci.init(PORT)
            step = 0
            while step < 15200:
               traci.simulationStep()

               step += 1

        sumoProcess = subprocess.Popen(["sumo-gui ", "-c", "sathon_s_lefthand.sumo.cfg ","-a", "TESTTTT.add.xml ",
                                         "--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr)

        run()
        sumoProcess.wait()

    def closebutton(self,event):
        self.Close(True)

    def closewindow(self, event):

        self.Destroy()

if __name__=='__main__':
app=wx.PySimpleApp()
frame=top(parent=None,id=-1)
frame.Show()
app.MainLoop()

由于对startsumo()中sumoProcess.wait()的调用,您的主线程正在等待子进程完成。 如果希望GUI响应,则无需在那里等待。

尝试以下替换方法来创建def startsumo

def startsumo(self,event):
    traci.init(PORT)
    step = 0
    while step < 15200:
        traci.simulationStep()
        step += 1
    sumoProcess = subprocess.Popen(["sumo-gui ", "-c", "sathon_s_lefthand.sumo.cfg ","-a", "TESTTTT.add.xml ",
                                     "--remote-port", str(PORT)], stdout=sys.stdout, stderr=sys.stderr).pid

这应该在不占用您当前流程的情况下运行。
sumoProcess将包含正在运行的程序的pid(例如,如果您需要将其杀死)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM