안녕하세요?

 

제목에는 final이라고 적었지만, 이게....... 공부라는 것을 어디까지 둘지 생각해 본다면, 일단 지금은 알고리즘 트레이딩을 하기 위해서 필요한 수준까지만이라고 하자면, 그 까지는 어떻게 도달한 것 같다는 것을 말하기 위해서 final이라고 이름을 붙였습니다. 물론 멀티 스레딩이니, QThread에서도 파면 팔수록 무한히 무언가가 나오겠지만, 언제까지 이것만 팔 수 없기에 이렇게 여기서 잠시 멈추고, 다음의 작업을 이어가도록 해 보는 것 입니다.

 

먼저 해야할 일은 이게 진짜로 동시에 실행이 된 것이 맞는지 아닌지 알아보기 위해서, 한번 위 스크린샷처럼 시간을 알 수 있는 모듈인 datetime을 import해 오도록 합니다.

 

그리고 나서 QRunnable에서 위 스크린샷처럼 시간을 적어 주도록 하고, 스레드가 실행이 되면, 그 시간도 같이 적어 주도록 만들어 줍니다.

 

그리고 나서 다음으로는 DANGER! 버튼을 누르는 순간의 시간도 기록해 주도록 만들어 줍니다. 이렇게 하는 것으로 진짜로 5초 쉬고난 이후에 제대로 정보가 들어온 것이 맞는지 알아보도록 하는 것입니다.

 

그리고 나서 한번 위 스크린샷처럼 정보를 보니까 진짜로 5호 이후에 정확히 같은 초를 지키면서 10개의 프로세스가 나란히 실행이 되는 것을 확인할 수 있었습니다. 물론 초 아래의 단위에서는 차이가 있을 수 있지만, 그것까지는 고려하지 않도록 합니다.

 

 

그리고 나서 한번 호기심이 생겨서 20개까지 스레드의 갯수를 올려보도록 해 보았습니다. 이런 경우에도 문제없이 실행이 가능한지 알아보기 위해서 입니다.

 

그리고 나서 당연하다면 당연하게도 한번 19까지 주어서 20개의 프로세스가 동시에 실행이 될 수 있도록 만들어 주도록 합니다.

 

일단 20개까지도 문제는 없어 보이기는 합니다만, 문제는 20개 동시에 실행이 되는 것이 아니라 19개까지만 실행이 되는 것을 볼 수 있었습니다. 물론 제가 이걸 갯수를 세는 과정에서 연속해서 실수를 할 수 있기는 하지만, 한번에 20개씩 이제 실행하는 것은 무리라는 것을 볼 수 있었습니다.

 

그리고 이렇게 멀티 스레딩- 그것도 PyQt에서 제공이 되는 QThread를 이용해서 하는 것을 하는 이유를 잊어 버리면 안됩니다. 제 아이디어의 구현을 위해서는 진짜로 1번 로그인을 한 다음에 제대로 로그인 정보를 여럿이서 가져올 수 있는지 알아보아야 합니다.

 

그리고 나서 로그인을 한 다음에 QRunnable에서는 싱글톤으로 되어 있는 위 스크린샷과 같은 식으로 Kiwoom()을 불러 오도록 합니다. 그리고 나서 유저 아이디를 가지고 오는 것으로 해 봅니다.

 

진짜로 같은 Kiwoom()을 가지고 왔으며, 이를 바탕으로 해서 5초 쉬라는 제 의도대로 쉰 다음에 각자 유저의 아이디를 가지고 오는 데 성공했습니다. 지금부터는 하나하나 정보를 가지고 오라는 식으로 해서, 정보를 가지고 와야 합니다. 즉, 제 알고리즘 투자자의 손과 발을 다른 식으로 만드는 아이디어에 구현 가능성이 겨우 보이기 시작했습니다.

'무모한 도전-주식 인공지능 만들기' 카테고리의 다른 글

QThread의 적용 part2  (0) 2019.07.28
QThread의 적용 part1  (4) 2019.07.27
QThread를 향한 공부-final-  (2) 2019.07.26
QThread를 향한 공부-4-  (0) 2019.07.26
QThread를 향한 공부-3  (2) 2019.07.26
QThread를 향한 공부-2-  (0) 2019.07.25
  1. 호바드 2020.02.22 20:59

    안녕하세요?

    QThread 개념이 이해 안되서.. 이 부분 몇번째 반복해서 따라 해 보고 있는데요..
    저는 인터넷떠돌이님과 결과가 차이가 있어서 진도를 못나가고 있습니다.. t.t
    똑 같이 따라한다고 하는데도 왜 저는 아래처럼 나올까요??

    C:\ProgramData\Anaconda3\envs\py37_32\python.exe C:/PycharmProjects/PytraderWithBrain/multithread2.py
    MultiThreading with maximum 20 threads
    13 : 15 : 54
    <kiwoom.Kiwoom object at 0x04630F80>
    <kiwoom.Kiwoom object at 0x04692120>
    <kiwoom.Kiwoom object at 0x04692260>
    <kiwoom.Kiwoom object at 0x046923A0>
    <kiwoom.Kiwoom object at 0x046924E0>
    progress0 13 : 15 : 59
    progress1 13 : 15 : 59
    progress2 13 : 15 : 59
    progress3 13 : 15 : 59
    progress4 13 : 15 : 59

    Process finished with exit code 0

    Work class의 init에서 self.K = Kiwoom()만을 호출했는데, 어떻게 결과 log를 보면 connected라고 나올 수 있는지 이해가 안됩니다... 그 부분이 문제 같습니다.

  2. 호바드 2020.02.22 21:01

    저의 multithread2.py 파일 내용입니다.

    from PyQt5.QtGui import *
    from PyQt5.QtCore import pyqtSlot
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *

    from kiwoom import Kiwoom
    import os, sys
    import time
    import datetime
    import traceback, sys

    class Worker(QRunnable):
    '''
    Worker Thread
    '''
    def __init__(self, number, *args, **kwargs):
    super(Worker, self).__init__(*args, **kwargs)
    self.K = Kiwoom()
    print(self.K)
    self.number = number

    @pyqtSlot()
    def run(self):
    time.sleep(5)
    loginState = self.K.get_login_info("USER_ID")
    second_nowtime = datetime.datetime.now().strftime('%H : %M : %S')
    print('progress%s' % self.number + ' ' + loginState + ' ' + second_nowtime)

    class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
    super(MainWindow, self).__init__(*args, **kwargs)

    self.counter = 0

    self.threadpool = QThreadPool.globalInstance()
    self.threadpool.setMaxThreadCount(20)
    print("MultiThreading with maximum %d threads" % self.threadpool.maxThreadCount())

    layout = QVBoxLayout()

    self.I = QLabel("Start")
    b = QPushButton("DANGER1")
    b.pressed.connect(self.oh_no)

    layout.addWidget(self.I)
    layout.addWidget(b)

    w = QWidget()
    w.setLayout(layout)

    self.setCentralWidget(w)

    self.show()

    self.timer = QTimer()
    self.timer.setInterval(1000)
    self.timer.timeout.connect(self.recurring_timer)
    self.timer.start()

    def execute_this_fn(self):
    print("Hellow")

    def oh_no(self):
    # Pass the function to execute
    first_nowtime = datetime.datetime.now().strftime('%H : %M : %S')
    print(first_nowtime)
    for i in range(5):
    worker = Worker(i)
    self.threadpool.start(worker)
    self.threadpool.waitForDone()

    def recurring_timer(self):
    self.counter += 1
    self.I.setText("Counter: %d" % self.counter)


    if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    app.exec_()

+ Recent posts