Как мне обработать несколько списков одновременно? - PullRequest
0 голосов
/ 14 октября 2019

У меня большой список номеров. Я хочу разбить этот большой список чисел на x количество списков и обработать их параллельно.

Вот код, который у меня есть:

from multiprocessing import Pool
import numpy

def processNumList(numList):
    for num in numList:
        outputList.append(num ** 2)

numThreads = 5

bigNumList = list(range(50))

splitNumLists = numpy.array_split(bigNumList, numThreads)

outputList = []

for numList in splitNumLists:
    processNumList(numList)

print(outputList)

Приведенный выше код выполняет следующее:

  • Разбивает большой список чисел на указанное количество меньших списков
  • Передает каждый из этих списков в функцию processNumList
  • Печатает список результатов впоследствии

Все там работает как положено, но одновременно обрабатывает только один список. Я хочу, чтобы каждый список обрабатывался одновременно.

Какой код подходит для этого? Я экспериментировал с pool, но никак не мог заставить его работать.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Вот код, который я использовал в итоге.

Я использовал threading.Thread() для асинхронной обработки списков, а затем вызвал thread.join(), чтобы убедиться, что все потоки были завершены, прежде чем двигаться дальше.

Я добавил time.sleep для демонстрационных целей (для имитации длительной задачи), но, очевидно, вы не захотите использовать это в рабочем коде.

import numpy
import threading
import time

def process_num_list(numList):
    for num in numList:
        output_list.append(num ** 2)
        time.sleep(1)

num_threads = 5

big_num_list = list(range(30))

split_num_lists = numpy.array_split(big_num_list, num_threads)

output_list = []

threads = []

for num_list in split_num_lists:
    thread = threading.Thread(target=process_num_list, args=[num_list])
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

print(output_list)


В качестве бонуса, вот рабочий пример пяти окон Selenium:

from selenium import webdriver
import numpy
import threading
import time

def scrapeSites(siteList):
    print("Preparing to scrape " + str(len(siteList)) + " sites")
    driver = webdriver.Chrome(executable_path = r"..\chromedriver.exe")
    driver.set_window_size(700, 400)
    for site in siteList:
        print("\nNow scraping " + site)
        driver.get(site)
        pageTitles.append(driver.title)
    driver.quit()

numThreads = 5

fullWebsiteList = ["https://en.wikipedia.org/wiki/Special:Random"] * 30

splitWebsiteLists = numpy.array_split(fullWebsiteList, numThreads)

pageTitles = []

threads = []

for websiteList in splitWebsiteLists:
    thread = threading.Thread(target=scrapeSites, args=[websiteList])
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

print(pageTitles)
0 голосов
/ 14 октября 2019

Вы можете попробовать что-то вроде этого:

import threading

class MyClass(threading.Thread):
    def __init__(self):
        # init stuff

    def run(self, arg, arg2):
        # your logic to process the list

# split the list as you already did
for _ in range(numThreads):
    MyThread(arg, arg2).start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...