Подскажите какую конструкцию обернуть в eventlet.tpool.execute() для правильной работы с задачами Apscheduler
Пишу сайт на Flask. Есть необходимость в использовании Apscheduler для периодического выполнения задачи. Но проблема в том что задача не выполняется периодически из-за конфликта с eventlet. На форумах я нашел что нужно обернуть блокирующую конструкцию в eventlet.tpool.execute(). Подскажите что именно мне нужно оборачивать?
Так я создаю єкземпляр BackgroundScheduler
scheduler = BackgroundScheduler(daemon=True)
Есть класс для работы с задачами.
from app import scheduler
import json
class SchedulerTask(object):
schedulers_list_publish = None
def __init__(self):
self.schedulers_list_publish = list()
def add_scheduler_publish(self, dev_id, mqtt, topic_req_res, m_req_state, qos_req, timer):
id_sch = dev_id + "_scheduler"
sc = scheduler.add_job(self.publish_async, args=[mqtt, topic_req_res, m_req_state, qos_req, timer, id_sch],
id=id_sch, trigger='interval', seconds=timer)
print(sc.id)
self.schedulers_list_publish.append(id_sch)
return id_sch
def start_schedulers(self):
print(self.schedulers_list_publish)
scheduler.start()
@staticmethod
def del_schedulers(s_id):
scheduler.remove_job(s_id)
# передача запроса на получение данных
@staticmethod
def publish_async(mqtt, topic_req_res, m_req_state, qos_req, timer, id_sch):
try:
msg = json.dumps(m_req_state)
mqtt.publish(topic_req_res, msg, qos_req)
except Exception as ex:
print("Error publish: " + str(ex))
Вызываю я из функции из другого модуля.
def _handle_connect(self, client, userdata, flags, rc):
code_list = list()
for dev in self.devices:
if dev.device_code not in code_list: # запущен ли уже поток с таким кодом
code_list.append(dev.device_code)
mqtt.subscribe("BK" + dev.device_code + self.type_topic[1], self.qos_sub)
self.schedulers_list.append(tpool.execute(sch_task.add_scheduler_publish, dev.device_code,
mqtt,
"BK" + dev.device_code + self.type_topic[0],
self.m_request_state,
self.qos_request,
self.POOL_TIME))
sch_task.start_schedulers()