안녕하세요?

 

이전 포스팅에 이어서 계속해서 올리는 이번 포스팅에서는 이번엔 계속해서 반복된 에러에 대해서 한번 탐구해 보다보니, 결국 어느 시점에 도달하게 되었고, 그 내용에 대해서 한번 올려 보고자 합니다.

 

그래서 계속해서 이런 방법만으로는 안되겠다는 생각이 들어서, 한번 위 스크린샷처럼 2번째 py파일을 만들어 보도록 합니다.

 

그리고 나서, 이번에는 위 스크린샷처럼 로그인을 하라는 명령을 주석처리 해서 중복해서 로그인을 하지 않도록 만들어 주도록 합니다.

 

그런데 다른 py파일에서 로그인을 했기 때문에 괜찮을 것이라고 생각을 했습니다만, 그렇지는 않았고, 위 스크린샷처럼 에러가 나오는 것을 볼 수 있었습니다.

 

다음으로는 위 스크린샷에서 볼 수 있는 것처럼 두번째 클래스에서 로그인을 하도록 하고, 위스크린샷에서 있는 메서드를 다 하도록 만들어 놓았습니다.

 

 

그리고 나서 새로운 메서드를 하나 더 만들어서, 여기서는 기본적인 정보를 가지고 오도록 만들어 주도록 합니다. 물론 이 정보는 txt파일에서 가지고 오는 것 입니다. 여기까지는 실행이 순조로웠습니다.

 

다음으로는 위 스크린샷처럼 한번 로그인을 하고나서 이제 멀티 프로세싱을 작동 시키라는 식으로 코드를 만들어 보도록 합니다.

 

그런데 실행을 시켰더니, 위 스크린샷처럼 어찌된 것인지 number가 없다는 식으로 나오면서 에러가 뜨는 것을 볼 수 있었습니다.

 

일단 이 에러까지는 위 스크린샷처럼 int형태를 str형태로 바꾸어 주는 것으로 간단하게 해결을 할 수 있기는 있었습니다. 개인적으로 이런 것은 일단 힘이 빠지기는 합니다.

 

대신 다른 문제가 생기는 것을 볼 수 있었습니다. 이번 문제는 위 스크린샷에서 볼 수 있는 것처럼 pickle을 할 수 없다는 메세지가 나옵니다.

 

그래서 한번 찾아보니까, 이런 에러를 해결하기 위해서는 위 스크린샷처럼 __call__메서드를 작성하는 것이 가장 간단한 해결책이라고 들어서, 이렇게 만들어 보도록 합니다.

 

그런데 이렇게 하고서도 여전히 can't pickle ~objects라는 에러가 생기는 것을 확인할 수 있었습니다. 이게 어떻게 된 에러인가 보니

 

위 스크린샷처럼 PyQt5 자체가 pickle이 되지 않는다 = 멀티 프로세싱에서 잡을 수 없도록 되어 있고, 예외적으로 위 QObjects들이 잡힐 수 있다는 것인데.......... 이건 무언가 좌절이라는 생각이 듭니다.

  1. 호바드 2020.03.28 22:24

    안녕하세요? 간만에 다시 따라하고 있습니다...

    GetInformation이라는 메쏘드는 불러서 사용하는 부분은 없네요...
    MyStockTrader2 클래스가 갑자기 (QtWidgets.QMainWindow) 이런 argument를 갖는걸로 설명이 되어 있어서..
    따라가다가.. 이해가 안되네요.. t.t
    휴~ 부분부분 소소가 보이다 보니.. 앞뒤 연결이 안되서...인제 실력도 딸리고....
    따라가기가 점점 어려워 집니다..

    class MyStockTrader2(QtWidgets.QMainWindow):
    에서 numbers = ['1', '2', '3', '4', '5'] 이부분은 def main():여기에 있었던 부분이였는데.. 갑자기 이쪽으로 옮긴건가요? T.T
    따라가기 힘들어요~~ T.T

    • 안녕하세요?

      제가 포스팅을 올리다 보니, 이래저래 빼먹은 부분이 있었습니다.

      import multiprocessing


      def TheProcessOfAction(SH, number):
      print("DDDD")
      MYS = SH

      MYS.GetInformation(number)
      print('marker3')
      MYS.InformationOfBasic()
      print('marker4')
      MYS.InformationOfAccount()
      print('marker5')
      MYS.IdentificationOfMoney()
      print('marker6')
      MYS.DataProcessing()
      print('marker7')
      MYS.AskToBrain()
      print('marker8')
      MYS.DecideOfAction(number)
      print('marker9')
      MYS.TradeStocks()
      print('marker10')
      sys.exit()


      def GOGOGO(SH):
      # MYS2 = MyStockTrader2()
      SH.LoginKiwoom()
      # numbers = ['1', '2', '3', '4', '5']
      numbers = [(SH, '1')]
      # numbers = [1, 2, 3, 4, 5]
      pool = multiprocessing.Pool(processes=1)
      # pool.map(self.ProcessOfAction, numbers)
      # pool.map(self, numbers)
      pool.starmap(TheProcessOfAction, numbers)
      pool.close()
      pool.join()


      class MyStockTrader2(QtWidgets.QMainWindow):
      def __init__(self):
      super().__init__()

      이렇게 첫번째 클래스가 시작 하기도 전에 이런 메서드를 작성하고서, 블로그 포스팅에서는 빼먹었는데, 이거 정말 죄송합니다.
      그리고 어려우신게 맞는게....... 저도 이거 하면서 정말정말 어려웠습니다. 포기할까 생각한 적은.......... 아마 3자리수를 넘지 않을까 합니다.

    • 아 그리고 빼먹었는데, 이걸 만들면서 기존에 있던 부분인

      numbers = ['1', '2', '3', '4', '5']
      pool = multiprocessing.Pool(processes=5)
      # pool.map(self.ProcessOfAction, numbers)
      pool.map(self, numbers)
      pool.close()
      pool.join()
      은 제가 주석처리를 하였습니다.

    • 아무래도 이 부분에 대해서는 정리가 슬슬필요한 것 같습니다. 저도 제가 쓴 코드를 다시 보니 머리가 어지러워서 이대로 가면 말 그대로 제작자도 잊어먹는 초유의 사태가 벌어질 듯 합니다.
      일단 여기서 다루는 내용은 제가 시도하다가 포기한 내용이고, 실제로는 다른 방식을 쓰는데, 그 내용을 blender에서 하고 있는 지금당장의 과제가 끝나면 정리해서 올려 보겠습니다.

  2. 호바드 2020.03.29 09:14

    정말 친절하게 답변 주셔서 감사합니다.~
    실제 현재 사용하는 방식이 아니면, 저도 Skip하겠습니다. ㅎㅎ

+ Recent posts