Python 如何提供多重处理。处理唯一变量

Python 如何提供多重处理。处理唯一变量,python,process,multiprocessing,Python,Process,Multiprocessing,我有一个包含ID号的列表,我想在API调用中为每个多处理器实现每个唯一的ID号,同时运行相同的对应函数,为每个处理器实现相同的条件语句等。我已经尝试过理解它,但关于这个过程的在线信息并不多 我想使用for循环,但我不想让运行这个for循环的每个处理器都拾取列表中的每一项。我只需要将每个项目关联到每个处理器 我是这样想的: from multiprocessing import process import requests, json ID_NUMBERS = ["ID 1", "ID 2"

我有一个包含ID号的列表,我想在API调用中为每个多处理器实现每个唯一的ID号,同时运行相同的对应函数,为每个处理器实现相同的条件语句等。我已经尝试过理解它,但关于这个过程的在线信息并不多

我想使用for循环,但我不想让运行这个for循环的每个处理器都拾取列表中的每一项。我只需要将每个项目关联到每个处理器

我是这样想的:

from multiprocessing import process 
import requests, json

ID_NUMBERS = ["ID 1", "ID 2", "ID 3".... ETC]
BASE_URL = "www.api.com"
KEY = {"KEY": "12345"}

a = 0

for x in ID_NUMBERS:
    def[a]():
        while Active_live_data == True:
            # continuously loops over, requesting data from the website
            unique_api_call = "{}/livedata[{}]".format(BASE_URL, x)
            request_it = requests.get(unique_api_call, headers=KEY)
            show_it = (json.loads(request_it.content))

            #some extra conditional code...

        a += 1

processes = []
b = 0

for _ in range(len(ID_NUMBERS))
    p = multiprocessing.Process(target = b)
    p.start()
    processes.append(p)    
    b += 1

任何帮助都将不胜感激

最亲切的问候


Andrew

您可以使用
map
功能:

import multiprocessing as mp
num_cores = mp.cpu_count()
pool = mp.Pool(processes=num_cores)
results = pool.map(your_function, list_of_IDs)

这将执行函数
your\u function
,每次都使用一个不同于列表
list\u of \u id
,并且
您的\u函数返回的值将存储在一个值列表中(
结果
).

与@AlessiaM的方法相同,但在
并发.futures
模块中使用高级api

import concurrent.futures as mp
import requests, json

BASE_URL = ''
KEY = {"KEY": "12345"}
ID_NUMBERS = ["ID 1", "ID 2", "ID 3"]

def job(id):
    unique_api_call = "{}/livedata[{}]".format(BASE_URL, id)
    request_it = requests.get(unique_api_call, headers=KEY)
    show_it = (json.loads(request_it.content))
    return show_it

# Default to as many workers as there are processors,
# But since your job is IO bound (vs CPU bound), 
# you could increase this to an even bigger figure by giving the `max_workers` parameter
with mp.ProcessPoolExecutor() as pool:
    results = pool.map(job,ID_NUMBERS)

# Process results here

感谢您的帮助,只是为了澄清我正在阅读的内容,“def作业(id)”中的“id”将一次输入一个“id_编号”项目?这个例子是否根据我的设备可以处理多少内核/线程来创建多个进程?这是正确的@andrewenglish,就像一个常规映射函数在一个iterable上工作一样。是的,创建的进程数量与你机器上的处理器数量相同。但是,如果您想增加或减少进程的数量,如果您想谢谢您,可以使用mp.ProcessPoolExecutor(max_workers=10)作为池!请仔细检查,'max_workers'是线程,而不是核心?因为
是并发的。futures
是一个高级层,
max_workers
是使用
ProcessPoolExecutor
的进程数,是使用
ThreadPoolExecutor
的线程数。因此,在上面的代码中,它将创建与机器上处理器数量相同的进程(而不是线程)。