如何重复请求任务
How to make repeated requests for tasks
我想向将 return 执行某些任务的服务器发出重复请求。服务器的响应将是一个字典,其中包含需要调用的函数列表。例如:
{
tasks: [
{
function: "HelloWorld",
id: 1212
},
{
function: "GoodbyeWorld"
id: 1222
}
]
}
注意:我正在模拟它。
对于这些任务中的每一个,我将 运行 使用 multiprocessing
指定的函数。这是我的代码示例:
r = requests.get('https://localhost:5000', auth=('user', 'pass'))
data = r.json()
if len(data["tasks"]) > 0:
manager = multiprocessing.Manager()
for task in data["tasks"]:
if task["function"] == "HelloWorld":
helloObj = HelloWorldClass()
hello = multiprocessing.Process(target=helloObj.helloWorld)
hello.start()
hello.join()
elif task["function"] == "GoodbyeWorld":
byeObj = GoodbyeWorldClass()
bye = multiprocessing.Process(target=byeObj.byeWorld)
bye.start()
bye.join()
问题是,我想重复请求并填充 data["tasks"]
数组,因为其他进程正在 运行ning。如果我将所有内容都放入某个 while
循环中,它只会在初始响应的所有进程完成后发出请求(当所有进程都达到 join()
时)。
谁能帮我重复请求,不断填充数组?如果我需要做出任何说明,请告诉我。
如果我没理解错的话,你需要这样的东西:
import time
from multiprocessing import Process
import requests
from task import FunctionFactory
def get_tasks():
resp = requests.get('https://localhost:5000', auth=('user', 'pass'))
data = resp.json()
return data['tasks']
if __name__ == '__main__':
procs = {}
for _ in range(10):
tasks = get_tasks()
if not tasks:
time.sleep(5)
continue
for task in tasks:
if task['id'] in procs:
# This task has been already submitted for execution.
continue
func = FunctionFactory.build(task['function'])
proc = Process(target=func)
proc.start()
procs[task['id']] = proc
# Waiting for all the submitted tasks to finish.
for proc in procs.values():
proc.join()
这里,函数get_tasks
用于从服务器请求带有id
和function
键的词典列表。在主要部分中,有一个 procs
字典将 id
映射到 运行 流程实例,这些流程实例执行由 FunctionFactory
使用接收到的任务的 function
名称构建的函数.如果已经有一个具有相同 ID 的 运行 任务,它将被忽略。
使用这种方法,您可以根据需要经常请求任务(此处,10
请求用于 for
循环)并启动进程以并行执行它们。最后,您只需等待所有提交的任务完成即可。
您的程序中有错误,您应该在创建所有任务后调用 ].加入块直到该过程完成 - 在您开始下一个之前的情况。这实际上让你整个程序 运行 顺序。
我想向将 return 执行某些任务的服务器发出重复请求。服务器的响应将是一个字典,其中包含需要调用的函数列表。例如:
{
tasks: [
{
function: "HelloWorld",
id: 1212
},
{
function: "GoodbyeWorld"
id: 1222
}
]
}
注意:我正在模拟它。
对于这些任务中的每一个,我将 运行 使用 multiprocessing
指定的函数。这是我的代码示例:
r = requests.get('https://localhost:5000', auth=('user', 'pass'))
data = r.json()
if len(data["tasks"]) > 0:
manager = multiprocessing.Manager()
for task in data["tasks"]:
if task["function"] == "HelloWorld":
helloObj = HelloWorldClass()
hello = multiprocessing.Process(target=helloObj.helloWorld)
hello.start()
hello.join()
elif task["function"] == "GoodbyeWorld":
byeObj = GoodbyeWorldClass()
bye = multiprocessing.Process(target=byeObj.byeWorld)
bye.start()
bye.join()
问题是,我想重复请求并填充 data["tasks"]
数组,因为其他进程正在 运行ning。如果我将所有内容都放入某个 while
循环中,它只会在初始响应的所有进程完成后发出请求(当所有进程都达到 join()
时)。
谁能帮我重复请求,不断填充数组?如果我需要做出任何说明,请告诉我。
如果我没理解错的话,你需要这样的东西:
import time
from multiprocessing import Process
import requests
from task import FunctionFactory
def get_tasks():
resp = requests.get('https://localhost:5000', auth=('user', 'pass'))
data = resp.json()
return data['tasks']
if __name__ == '__main__':
procs = {}
for _ in range(10):
tasks = get_tasks()
if not tasks:
time.sleep(5)
continue
for task in tasks:
if task['id'] in procs:
# This task has been already submitted for execution.
continue
func = FunctionFactory.build(task['function'])
proc = Process(target=func)
proc.start()
procs[task['id']] = proc
# Waiting for all the submitted tasks to finish.
for proc in procs.values():
proc.join()
这里,函数get_tasks
用于从服务器请求带有id
和function
键的词典列表。在主要部分中,有一个 procs
字典将 id
映射到 运行 流程实例,这些流程实例执行由 FunctionFactory
使用接收到的任务的 function
名称构建的函数.如果已经有一个具有相同 ID 的 运行 任务,它将被忽略。
使用这种方法,您可以根据需要经常请求任务(此处,10
请求用于 for
循环)并启动进程以并行执行它们。最后,您只需等待所有提交的任务完成即可。
您的程序中有错误,您应该在创建所有任务后调用 ].加入块直到该过程完成 - 在您开始下一个之前的情况。这实际上让你整个程序 运行 顺序。