Остановка Python Sched в отдельном потоке - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть расписание Python из модуля sched, которое я хочу выполнить в отдельном потоке, но при этом могу остановить его в любой момент.Я посмотрел threading module, но не знаю, какой из них лучше всего реализовать.

пример расписания:

>>> s.run()
one
two
three
end

пример расписания в потоке:

>>> t = threading.Thread(target = s.run)
>>> t.start()
one
two
>>> print("ok")
ok
three
end
>>>

желаемый результат:

>>> u = stoppable_schedule(s.run)
>>> u.start()
>>>
one
two
>>> u.stop()
"schedule stopped"

1 Ответ

0 голосов
/ 25 февраля 2019

То, что вы описываете, это потоки, которые могут быть асинхронно остановлены.

Как описано здесь , существует два основных подхода.Одним из них является проверка кода потока для какого-либо события (запускаемого u.stop() в вашем примере) для каждой выполняемой операции.

Другое решение - принудительно вызвать ошибку в каком-либо потоке.Этот подход проще реализовать, но он может вызвать неожиданное поведение, и чем сложнее код вашего потока, тем опаснее он становится.

import ctypes


ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)

Где tid - поток, который должен быть завершен.Вы можете получить идентификатор потока, запустив (в теме):

print self._thread_id

Подробнее об этом можно прочитать в блоге thread2 , опубликованном Томером Филиба.

...