как предоставить уникальные переменные multiprocessing.process - PullRequest
1 голос
/ 29 мая 2020

У меня есть список, содержащий идентификационные номера, я хочу реализовать каждый уникальный идентификационный номер в вызове API для каждого мультипроцессора, одновременно выполняя те же соответствующие функции, реализуя одни и те же условные операторы для каждого процессора et c. Я попытался разобраться в этом, но в Интернете об этой процедуре не так много.

Я думал использовать a для l oop, но я не хочу, чтобы каждый процессор запускал это для l oop собирать каждый элемент в списке. Мне просто нужно, чтобы каждый элемент был связан с каждым процессором.

Я думал примерно так:

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

Любая помощь будет принята с благодарностью!

С наилучшими пожеланиями,

Андрей

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Тот же подход, что и @AlessiaM, но с использованием высокоуровневого API в модуле concurrent.futures.

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
1 голос
/ 29 мая 2020

Вы можете использовать функцию 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_function, каждый раз с другим элементом из списка list_of_IDs, и значениями, возвращаемыми your_function будет сохранено в списке значений (results).

...