如何反复提出任务要求

我想重复请求服务器,该服务器将返回一些任务。服务器的响应将是字典,其中包含需要调用的功能列表。例如:

{ 
   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"]数组。如果我将所有内容都放入某个while循环中,那么它只会在初始响应的所有过程完成后(所有过程都达到join()时才发出请求)。

有人可以帮助我重复请求并连续填充数组吗?请让我知道是否需要澄清。

xiaojiamail 回答:如何反复提出任务要求

如果我对您的理解正确,则需要这样的东西:

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用于从服务器请求带有idfunction键的字典列表。在主要部分中,有一个procs字典,该字典将id映射到正在运行的流程实例,这些实例使用接收到的任务的FunctionFactory名称执行由function构建的功能。如果已经有一个具有相同ID的正在运行的任务,它将被忽略。

使用这种方法,您可以根据需要频繁地请求任务(此处10循环中使用for请求)并启动进程以并行执行它们。最后,您只需要等待所有提交的任务完成即可。

,

您的程序中存在错误,创建完所有任务后,应在{strong>之后调用join。加入块,直到该过程完成为止-就您而言,在开始下一个过程之前。实际上,这使您整个程序按顺序运行。

本文链接:https://www.f2er.com/3131955.html

大家都在问