나는 GUI와 프로그램 로직을 파이썬으로 작성했다. 웹에서 정보를 요청하는 중 urllib.requests
(기타 등등)을 자주 호출하면 GUI가 응답하지 않을 때 문제가 발생하지만이 호출은 QThread
으로 래핑됩니다. 나는 그것이 GIL
때문에 일어난다고 생각한다. 하지만 내가 어떻게 PyQt 응용 프로그램에서 QThread
을 사용할 수 있습니까? PyQt
에서 비동기 적으로 작동하도록 코드를 만들 수 없다면 어떻게 사용합니까? 위해 내 경우PyQt, QThread, GIL, GUI
import qtthreaddecorator
class MainWindow(QtGui.QMainWindow, form_class):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.init()
def init(self):
@qtthreaddecorator.qt_thread_decorator(self._fill_servers)
def _get_servers():
self._get_my_servers()
@qtthreaddecorator.qt_thread_decorator(self._fill_user_info)
def _get_user_info():
self._get_user_info()
_get_servers()
_get_user_info()
, _get_servers()
및 _get_user_info()
호출하지만 I :
--The는
qtthreaddecorator.py:
from PyQt4 import QtCore
class Worker(QtCore.QThread):
def __init__(self, thread_name, finished_slot, function, *args, **kwargs):
QtCore.QThread.__init__(self)
self._thread_name = thread_name
self._function = function
self._args = args
self._kwargs = kwargs
self._finished_slot = finished_slot
def run(self):
self._function(*self._args, **self._kwargs)
self._finished_slot()
return
def qt_thread_decorator(slot):
def decorator(function):
def wrapper(*args, **kwargs):
worker = Worker(function.__name__, slot, function, *args, **kwargs)
worker.start()
return
return wrapper
return decorator
그리고 내가 사용하고있는 장소를 code-- 동시에 실행하려고합니다.
이 올바르게 스레드를 시작 있습니까 :
을 그리고이 장식을 사용하는 코드 'worker_thread.start()'를 사용하고 있습니까? 왜냐하면 만약 당신이'worker_thread.run()'을 실행하면 그것은 실행될 것이기 때문이다. 다른 스레드가 아닙니다. – Fenikso
정확히 worker_thread.start()입니다. 잠깐, 코드를 게시 할게. –
흥미로운 데코레이터 사용 ... 다른 스레드에서 잠을 자고있는 작은 실행 가능한 예제를 작성 하시겠습니까? 또는 실용적인 스레딩 예제로 질문에 대답 할 수는 있지만 질문이 서면으로 답할지는 확실하지 않습니다. – Fenikso