Понимание концепций с одновременным будущим для ускорения веб-скрепинга - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть программа для удаления веб-страниц, которая очищает тысячи веб-сайтов. Тем не менее, это очень медленно. Я нашел некоторые вещи в concurrent.futures, которые я пытаюсь реализовать; Тем не менее, я не могу получить хороший gr asp о том, как это работает. Я приложил простой код ниже для кого-то, чтобы помочь объяснить концепцию, но в моей другой программе, он перебирает значения x, но, похоже, пропускает некоторые x. Я не знаю, происходит ли это из-за того, что запущено несколько потоков, и им не хватает их, или что происходит. Я надеюсь, что объяснение этого кода поможет мне понять, как приблизиться к другому коду.

Когда я запускаю приведенный ниже код, он выводит несколько цифр и несколько раз. Например, он показывает 456, 789100, 123, 45, 678910012 на отдельных строках, плюс еще кучу. Я не уверен, что понимаю, почему он повторяется несколько раз и печатает их все несколько раз. Любая помощь с этими, казалось бы, простыми понятиями будет высоко ценится.

import time

import concurrent.futures
from concurrent.futures import ProcessPoolExecutor, as_completed

a=[0,1,2,3,4,5,6,7,8,9,10]
def printNumbers(a):
    print(a)


with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:

    start = time.time()
    futures = [executor.map(printNumbers, a) for url in a]
    #results = []
    #for result in as_completed(futures):
    #    results.append(result)
    #    print(results)

    #futures = [executor.submit(testing,url) for url in urlList]
    #results = []
    #for result in as_completed(futures):
    #    results.append(result)
    end=time.time()
    print("Time taken: {:.6f}s".format(end-start))

print('break')

1 Ответ

0 голосов
/ 07 февраля 2020

Вам нужно изменить код, чтобы он работал, будет работать следующее:

import time
import concurrent.futures

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def printNumbers(a):
    print(f'entered {a}')
    time.sleep(1)
    return a * a


with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:
    for number, a_i in zip(a, executor.map(printNumbers, a)):
        print(number, a_i)

Вывод:

entered 0
entered 1
entered 2
entered 3entered 4

entered 5entered 6

entered 7
entered 8
entered 9
entered 10
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
...