Итак, я использую многопроцессорность. Процесс пытается распараллелить выполнение некоторого кода, который загружает данные JSON, подготавливает их и записывает в CSV.
Приведенный ниже код работает нормально, но из того, что я читал, например, здесь , кажется, что я должен (?) Также выполнять многопоточную обработку тяжелых частей моего процессораcode.
Я собираюсь немного упростить код, чтобы его было легче понять:
from multiprocessing import Process, Lock
import requests, json, csv, os, re, pathlib
from lxml import html
import urllib.request
if __name__ == '__main__':
def run_parallel(*fn):
# bunch of code to prep a dictionary structure "links_dict"
# "links_dict" has 40 keys, and each key is associated with a list of 3000+ urls
# "sliced_dicts" list is created, with len() = 4
# each index is dict with 10 of the keys, and their list, from links_dict
l = Lock()
proc = []
for i in range(4):
p = Process(target = getData, args = (sliced_dicts[i], l))
p.start()
proc.append(p)
for p in proc:
p.join()
run_parallel(getData)
getData(links_dict, l):
for (key, vals) in links_dict.items(): # iterate through the keys
dir = '/data/%s' %key
pathlib.Path(dir).mkdir(parents=True, exist_ok=True)
for link in vals: # iterate through the links within a given key
resp = urllib.request.urlopen(val).read()
data = json.loads(resp)
# process and clean the data, grab the relevant parts, store it in "curr_dict"
# ...
l.acquire()
with open(dir+'/'+current data name+".csv", mode="w",newline='') as csvfile:
writer = csv.writer(csvfile, delimiter = ",")
writer.writerow(["Date","Value"])
for row in curr_dict.items():
writer.writerow(row)
csvfile.close()
l.release()
Причина, по которой я изначально избегал Threading, заключается в том, что у меня не может быть разных процессов.доля государства;поскольку каждый из них должен писать в отдельные файлы CSV, каждый раз, когда анализируется ссылка.
По сути каждый процесс инициализируется с 1/4 от общего количества ссылок (потому что у меня есть 4 ядра).Единственные операции с интенсивным использованием процессора выполняются после загрузки данных, поэтому, насколько я понимаю, я должен иметь возможность добавлять новый поток для каждого ресурса загрузки (как обсуждено здесь ).
Так что мойВопрос в том, могу ли я загружать ресурсы параллельно (используя Threading) в рамках многопроцессорной обработки. Процесс, не комбинируя выходные данные внутри или среди этих процессов / потоков?
В противном случае хотелось бы услышать ваши общие мысли / рекомендации о том, как ускорить исполнение.