我正在使用 python 构建一个接口(interface),该接口(interface)从收集器表 -> 移交给通用接口(interface)表 -> 转换
并触发到外部系统。我还有轮询器将状态更新回接口(interface)表和收集器表。
@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()
最佳答案
我认为你走错了方向。您应该将不同的功能分离到不同的应用程序。基于 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()
关于python - 如何独立于主程序流程触发python方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34152247/