如何独立于主程序流触发python方法?

时间:2015-12-08 09:28:52

标签: python flask

我正在使用从收集器表中获取的python构建接口 - >移交到公共接口table -> transform并触发到外部系统。我也有轮询器将状态更新回接口表和收集器表。

@synch.route("/ssr_synch", methods=['GET', 'POST'])
def callSSRSynch():
    batch_txn_id = request.args.get('batch_txn_id')
    if request.method == 'POST':
        batch_txn_id = request.form['batch_txn_id']
        if request.form['synch'] == 'synch':
            if app.config['stub'] == 'False':
                ssr_collector.main()
                ssr_provisioning.main() #for interface table
                ssr_poller.main()
            form = "Synch completed for batch transaction id %s" % (batch_txn_id,)

目前,在请求触发调用之后,收集器和配置在轮询器之前运行。我希望独立于收集器和配置启动轮询器。

不确定线程​​是最好的方法还是有更简单的解决方案?

2015年12月9日更新:

线程似乎是最简单的方法。设法使这项工作:

threads = list() 
thread1 = threading.Thread(target=ssr_collector.main, args=(batch_txn_id,))
thread2 = threading.Thread(target=ssr_provisioning.main) 
thread3 = threading.Thread(target=ssr_poller.main) 
threads.append(thread1) 
threads.append(thread2) 
threads.append(thread3) 
for t in threads: t.start() 
for t in threads: t.join()

1 个答案:

答案 0 :(得分:1)

我认为你的方向错了。您应该将不同的功能分离到不同的应用程基于flask框架的应用程序是您的入口点,客户端可以在其中运行新任务或获取有关当前正在运行或已经完成的任务的信息。在完成任务之前,此应用程序不应运行任务本身或阻止客户端连接!有很多很好的工具是专门为这个用例创建的,例如Celery

Api方法:

@synch.route("/ssr_synch", methods=['POST'])
def callSSRSynch():
    batch_txn_id = request.args.get('batch_txn_id')
    if request.method == 'POST':
        batch_txn_id = request.form['batch_txn_id']
        if request.form['synch'] == 'synch':
            if app.config['stub'] == 'False':
                collector.delay()
                provisioning.delay()
                poller.delay()         

            form = "Synching for batch transaction id %s" % (batch_txn_id,)

任务:

@celery.task
def collector():
    ssr_collector.main()

@celery.task
def provisioning():
    ssr_provisioning.main()

@celery.task
def poller():
    ssr_poller.main()