многопроцессорность и загрузка процессора для задач ввода-вывода Python - PullRequest
0 голосов
/ 30 мая 2018

Итак, я использую многопроцессорность. Процесс пытается распараллелить выполнение некоторого кода, который загружает данные 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) в рамках многопроцессорной обработки. Процесс, не комбинируя выходные данные внутри или среди этих процессов / потоков?

В противном случае хотелось бы услышать ваши общие мысли / рекомендации о том, как ускорить исполнение.

...