파이썬 멀티프로세싱? 코드 작동원리가 궁금합니다.

조회수 2192회
import time
import multiprocessing as mp
import wx

def myWorker(a, b):
    time.sleep(3)
    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)
       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)
        return True

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()

위 코드를 실행하면 두 종류 버튼아이콘이 있습니다. def onProcess(event) 함수안에서 멀티프로세싱으로 실행하고있는데 타겟이 타임슬립이 작동는 함수 인데 버튼을 누르면 프로그램이 멈추지 않고 다른 버튼 프로그램이 실행이 됩니다 클래스2개 줘서 그런거같지는 않고... 저도 비슷하게 만들어봤는데 저는 프로그램이 타임슬립 시간만큼 정지하는데... 위 코는 멈추지않고 작동이 가능한지 궁금합니다..

import wx, time
import multiprocessing

class f(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.panel = wx.Panel(self)

        self.button = wx.Button(self.panel, -1, "클릭", pos=(100,100))
        self.button.Bind(wx.EVT_BUTTON, self.proccessing, id=-1)

    def proccessing(self, e):
        multiprocessing.Process(target=self.timesleep()).start()

    def timesleep(self):
        time.sleep(3)
        for i in range(10, 20):
            print(i)

if __name__ == '__main__':
    app = wx.App()
    fr = f()
    fr.Show(True)
    app.MainLoop()

2 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    multiprocessing.Process(target=self.timesleep()).start() 
    

    에서 target 부분에 self.timesleep() 가 아닌 self.timesleep 로 줘 보세요.

    multiprocessing.Process(target=self.timesleep).start() 
    

    target=self.timesleep() 을 해버리면 그 순간 timesleep() 메소드가 호출됩니다. 그래서 바로 sleep()이 걸리는 거지요.

    target인자엔 메소드의 ID값을 넘겨줘야 합니다.

  • 답변감사드립니다.

    import wx, time
    import multiprocessing
    
    def proccessing(event):
        multiprocessing.Process(target=timesleep).start()
    
    def timesleep():
        time.sleep(3)
        for i in range(10, 20):
            print(i)
    
    class f(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None)
            self.panel = wx.Panel(self)
            self.button = wx.Button(self.panel, -1, "클릭", pos=(100,100))
            self.button.Bind(wx.EVT_BUTTON, proccessing, id=-1)
    
    if __name__ == '__main__':
        app = wx.App()
        fr = f()
        fr.Show(True)
        app.MainLoop()
    

    말씀대로 변경하니 되는데.. 클래스 안에 함수를 넣어서 사용하면 안되네요 ... 이건 아마 클래스속에 하나로 연결되어서 그런거겠죠??

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)