Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask,在不停止多线程Python的情况下处理Popen轮询/等待/通信_Python_Flask_Subprocess_Python Multithreading - Fatal编程技术网

Python Flask,在不停止多线程Python的情况下处理Popen轮询/等待/通信

Python Flask,在不停止多线程Python的情况下处理Popen轮询/等待/通信,python,flask,subprocess,python-multithreading,Python,Flask,Subprocess,Python Multithreading,下面的代码在特定URL(/new…)上执行,并将变量分配给会话cookie,该会话cookie用于构建显示。此示例使用subprocess.Popen调用命令 问题在于,下面调用的Popen命令通常需要3分钟,而subprocess.communicate会等待输出,在此期间,所有其他Flask调用(例如,另一个用户连接)都会暂停。我有一些注释行与我尝试过的其他事情相关,但没有成功-一个使用线程模块,另一个使用subprocess.poll from app import app from fl

下面的代码在特定URL(/new…)上执行,并将变量分配给会话cookie,该会话cookie用于构建显示。此示例使用subprocess.Popen调用命令

问题在于,下面调用的Popen命令通常需要3分钟,而subprocess.communicate会等待输出,在此期间,所有其他Flask调用(例如,另一个用户连接)都会暂停。我有一些注释行与我尝试过的其他事情相关,但没有成功-一个使用线程模块,另一个使用subprocess.poll

from app import app
from flask import render_template, redirect, session
from subprocess import Popen, PIPE
import threading


@app.route('/new/<number>')
def new_session(number):
    get_list(number)
    #t = threading.Thread(target=get_list, args=(number))
    #t.start()
    #t.join()

    return redirect('/')

def get_list(number):
    #1 Call JAR Get String
    command = 'java -jar fetch.jar' + str(number)
    print "Executing " + command
    stream=Popen(command, shell=False, stdout=PIPE)

    #while stream.poll() is None:
    #    print "stream.poll = " + str(stream.poll())
    #    time.sleep(1)
    stdout,stderr = stream.communicate()

    #do some item splits and some processing, left out for brevity
    session['data'] = stdout.split("\r\n")

    return
从应用程序导入应用程序
从flask导入渲染_模板,重定向,会话
从子流程导入Popen、PIPE
导入线程
@app.route(“/new/”)
def新建_会话(编号):
获取列表(编号)
#t=threading.Thread(target=get_list,args=(number))
#t、 开始()
#t、 加入
返回重定向(“/”)
def get_列表(编号):
#1调用JAR获取字符串
command='java-jarfetch.jar'+str(数字)
打印“正在执行”+命令
stream=Popen(命令,shell=False,stdout=PIPE)
#当stream.poll()为无时:
#打印“stream.poll=“+str(stream.poll())
#时间。睡眠(1)
stdout,stderr=stream.communicate()
#做一些项目拆分和一些处理,为简洁起见
会话['data']=stdout.split(“\r\n”)
返回
正确处理这种情况的“更好的做法”是什么


作为参考,此代码在win32上的Python 2.7.8中运行,包括Flask 0.10.1。首先,您应该使用芹菜、RabbitMQ或Redis之类的工作队列(这里是一个示例)

然后,将
get_list
函数定义为:

@celery.task
def get_list(number):
    command = 'java -jar fetch.jar {}'.format(number)
    print "Executing " + command
    stream = Popen(command, shell=False, stdout=PIPE)
    stdout, stderr = stream.communicate()
    return stdout.split('\r\n')
在你看来,你在等待结果:

@app.route('/new/<number>')
def new_session(number):
    result = get_list.delay(number)
    session['data'] = result.wait()
    return redirect('/')
@app.route(“/new/”)
def新建_会话(编号):
结果=获取列表。延迟(数字)
会话['data']=result.wait()
返回重定向(“/”)

现在,它不会阻挡您的视线!:)

首先,您应该使用芹菜、RabbitMQ或Redis等工作队列(下面是一个示例)

然后,将
get_list
函数定义为:

@celery.task
def get_list(number):
    command = 'java -jar fetch.jar {}'.format(number)
    print "Executing " + command
    stream = Popen(command, shell=False, stdout=PIPE)
    stdout, stderr = stream.communicate()
    return stdout.split('\r\n')
在你看来,你在等待结果:

@app.route('/new/<number>')
def new_session(number):
    result = get_list.delay(number)
    session['data'] = result.wait()
    return redirect('/')
@app.route(“/new/”)
def新建_会话(编号):
结果=获取列表。延迟(数字)
会话['data']=result.wait()
返回重定向(“/”)

现在,它不会阻挡您的视线!:)

首先,您应该使用芹菜、RabbitMQ或Redis等工作队列(下面是一个示例)

然后,将
get_list
函数定义为:

@celery.task
def get_list(number):
    command = 'java -jar fetch.jar {}'.format(number)
    print "Executing " + command
    stream = Popen(command, shell=False, stdout=PIPE)
    stdout, stderr = stream.communicate()
    return stdout.split('\r\n')
在你看来,你在等待结果:

@app.route('/new/<number>')
def new_session(number):
    result = get_list.delay(number)
    session['data'] = result.wait()
    return redirect('/')
@app.route(“/new/”)
def新建_会话(编号):
结果=获取列表。延迟(数字)
会话['data']=result.wait()
返回重定向(“/”)

现在,它不会阻挡您的视线!:)

首先,您应该使用芹菜、RabbitMQ或Redis等工作队列(下面是一个示例)

然后,将
get_list
函数定义为:

@celery.task
def get_list(number):
    command = 'java -jar fetch.jar {}'.format(number)
    print "Executing " + command
    stream = Popen(command, shell=False, stdout=PIPE)
    stdout, stderr = stream.communicate()
    return stdout.split('\r\n')
在你看来,你在等待结果:

@app.route('/new/<number>')
def new_session(number):
    result = get_list.delay(number)
    session['data'] = result.wait()
    return redirect('/')
@app.route(“/new/”)
def新建_会话(编号):
结果=获取列表。延迟(数字)
会话['data']=result.wait()
返回重定向(“/”)

现在,它不会阻挡您的视线!:)

向上投票!如果你必须从不同网站的流中获取API数据,你认为芹菜是正确的工具吗!如果你必须从不同网站的流中获取API数据,你认为芹菜是正确的工具吗!如果你必须从不同网站的流中获取API数据,你认为芹菜是正确的工具吗!如果您必须并行地从不同网站的流中获取API数据,您认为芹菜是正确的工具吗