2016-09-16 4 views
0

Я хотел бы начать свой бесконечный сценарий Python внутри запроса Колбы:Запустите бесконечный питон скрипт в новом потоке в термосе

def start_process(): 
    exec(open("./process/main.py").read(), globals()) 
    print("Started") 
    return 

и с просьбой:

@app.route("/start") 
    def start(): 
    from threading import Thread 
    thread = Thread(target=start_process, args=()) 
    thread.setDaemon(True) 
    thread.start() 
    return redirect(url_for('main')) 

main.py процесса это небольшой тестовый сервер, который ждет некоторых сообщений, но он просто висит весь скрипт фляжки (на самом деле, через gunicorn, если я отправлю CTRL-C, я могу увидеть выход подпроцесса).

Как я могу начать запуск скрипта main.py?

ответ

0

Я не успешно начал длительную нить изнутри Flask, но пошел другим путем, начиная Flask в потоке и предоставляя ему способ общения с другими потоками.

Хитрость заключается в том, чтобы что-то вдоль линий

def webserver(coordinator): 
    app.config['COORDINATOR'] = coordinator 
    app.run(use_reloader=False) 
    # use_reloader=False is needed to keep Flask happy in a thread 

def main(): 
    coordinator = Coordinator() 
    ui = threading.Thread(target=webserver, args=(coordinator,)) 
    ui.start() 
    # start other threads, passing them coordinator 
    # start long-running tasks in main thread, passing it coordinator 

Где Coordinator использует threading объекты (например, Lock, Queue) для защиты доступа к общим данным или ресурсам. Вы можете довольно легко настроить координатора для поддержки блокировки рабочих потоков до тех пор, пока не будут сигнализированы (от обработчика), а затем запустите длительные задачи.

+0

Он делает обратное тому, что я хочу сделать, но это всегда своего рода решение. – Alessandro