Остановите задание apscheduler из другого метода файла .py - PullRequest
0 голосов
/ 02 июня 2019

Я создаю задание apscheduler в одной функции, вызываю эту функцию в приложении фляги в before_first_request ().Это задание запускает функцию каждые 30 секунд (которая находится в другом файле .py в моем приложении фляги).Основываясь на одном конкретном результате (из еще одного файла .py), я должен прекратить это задание apscheduler.

In app.py:
@myapp.before_first_request
def before_first_request():
    ..
    ..
    check_conn()

then in checking.py, I'm creating and starting a Background_scheduler job.
def check_conn():
    with myapp.test_request_context():
        global process_scheduler
        process_scheduler = BackgroundScheduler()
        process_scheduler.add_job(func=send_conn_check, trigger="interval", seconds=10, id='conn_job')
        process_scheduler.start()
        atexit.register(lambda: process_scheduler.shutdown())

this 'send_conn_check' is in sendxx.py:
def send_conn_check():
    ....  # sends message at regular time interval
    ....

When a message is received for first time in backgrnd.py, the below function will do some work and then call 'check_state' method to remove the apscheduler job,
def call_conn_accept(ch, method, properties, body):
    try:
        print('Connection message from abc %r' % body)
        json_str = body.decode('utf-8')
        ...
        if accept == "ACCEPT":
            check_state()  # this function is defined in checking.py

Again in checking.py, 
def check_state():
    global process_scheduler
    process_scheduler.remove_job(job_id='conn_job') ####  At this point I have remove the process_scheduler job. 
    ....
    ....

node1_CONN # Планировщик, отправляющий сообщение

node1_CONN

node1_CONN

ОШИБКА: root: возникла исключительная ситуация :( "имя 'process_scheduler' не определено",) # когда вызывается process_scheduler в check_state () в check.py для удаления задания apscheduler.

Сообщение о соединении от abc '{"node1": "ACCEPT"}'

node1_CONN # Как только вышеприведенное сообщение получено, планировщик должен удалить задание, но это не так.Он снова отправляет 'node1_CONN'

ОШИБКА: root: возникла исключительная ситуация :( "имя 'process_scheduler' не определено",)

Сообщение о соединении от abc '{"node1": "ПРИНЯТЬ "} '... ...

1 Ответ

0 голосов
/ 04 июня 2019

Я решил это, поместив логику в многопроцессорный процесс на python, а также запустив поток внутри этого многопроцессорного демона, чтобы вызывать функцию 'send' каждые x секунд, и отменял поток, когда условие выполнялось внутри другой функции того же самого многопроцессный демон ..

from multiprocessing import Process

class processClass:
    def __init__(self):
        print("Starting the multiprocess app...")
        p = Process(target=self.run, args=())
        p.daemon = True                       # Daemonize it
        p.start()                             # Start the execution

  def run(self):
        #with myapp.test_request_context():
        print('listening...')
        send_conn_check()                     # Calling send function thread 
        listen_state()                        # Calling receive function.

def send_conn_check():
    global t                              
    t = threading.Timer(10, send_conn_check)  #Thread
    t.daemon = True
    t.start()
    ...
    ...

def listen():
  try:
    ...
    ...
    if accept == 'ACCEPT':
        t.cancel()                           # Cancel the thread when a condition is met
        check_state()
...