Skip to main content
 首页 » 编程设计

python之如何重复请求任务

2024年08月12日30pander-it

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

{  
   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() 已达到所有过程)。

谁能帮我重复请求,不断填充数组?如果我需要做出任何说明,请告诉我。

请您参考如下方法:

如果我没理解错的话,你需要这样的东西:

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 使用接收到的任务构建的函数 函数名称。如果已经有一个具有相同 ID 的正在运行的任务,它将被忽略。

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