Python 如何提供多重处理。处理唯一变量
我有一个包含ID号的列表,我想在API调用中为每个多处理器实现每个唯一的ID号,同时运行相同的对应函数,为每个处理器实现相同的条件语句等。我已经尝试过理解它,但关于这个过程的在线信息并不多 我想使用for循环,但我不想让运行这个for循环的每个处理器都拾取列表中的每一项。我只需要将每个项目关联到每个处理器 我是这样想的: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"
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
的线程数。因此,在上面的代码中,它将创建与机器上处理器数量相同的进程(而不是线程)。