Вопрос:
Здесь реализована стоп-нить и попытка ее использования:
import threading class StoppableThread(threading.Thread): «»»Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.»»» def __init__(self, target, kwargs): super(StoppableThread, self).__init__(target, kwargs) self._stop_event = threading.Event() def stop(self): self._stop_event.set() def stopped(self): return self._stop_event.it_set() def func(s): print(s) t = StoppableThread(target = func, kwargs={«s»:»Hi»}) t.start()
Этот код генерирует ошибку:
Traceback (most recent call last): File «test.py», line 19, in <module> t = StoppableThread(target = func) File «test.py», line 7, in __init__ super(StoppableThread, self).__init__(target) File «/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/threading.py», line 780, in __init__ assert group is None, «group argument must be None for now» AssertionError: group argument must be None for now
Я хотел бы знать, почему и как это исправить.
Лучший ответ:
первый аргумент для потока – это группа, поэтому вам нужно указать имя для цели
super(StoppableThread, self).__init__(target=target, kwargs)
есть документ
class threading.Thread(group = None, target = None, name = None, args =(), kwargs = {})
https://docs.python.org/2/library/threading.html#threading.Thread
Ответ №1
Попробуйте следующее:
import threading class StoppableThread(threading.Thread): «»»Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.»»» def __init__(self, *args, **kwargs): super(StoppableThread, self).__init__(*args, **kwargs) self._stop_event = Event()
*args – последовательность с каждым позиционным аргументом, а **kwargs – словарь с каждым аргументом key-wrod. Используя эту нотацию, вы передаете каждый аргумент, StoppableThread конструктор StoppableThread его родительскому StoppableThread. Имена варсов *args и **kwargs являются произвольными.