У меня есть графический интерфейс и программная логика, написанная на Python. Я запрашиваю информацию из Интернета, вызывая urllib.requests
(и так далее) очень часто, и это вызывает проблему, когда графический интерфейс не отвечает, но эти вызовы завернуты в QThread
. Я думаю, что это происходит из-за GIL
. Но как, если я могу использовать QThread
в приложении PyQt, какая польза от него в PyQt
, если я не могу заставить код работать асинхронно?
--Код--
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
И место, где я его использую:
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()
вызываются по порядку, но я хочу выполнять их одновременно.
worker_thread.start()
? Потому что, если вы сделаетеworker_thread.run()
, он запустится. Только не в другой теме. - person Fenikso   schedule 08.09.2014wrapper
не возвращает рабочего, поэтому он не существует вне этой функции. - person user3419537   schedule 08.09.2014wrapper
. В конечном счете вам нужно, чтобы работник существовал вне функций, которые вы декорируете, иначе вы столкнетесь с той же проблемой, когда эти функции вернутся. Я думаю, что вы слишком усложняете для себя, используя декораторы. - person user3419537   schedule 08.09.2014