У меня проблемы с концептуализацией этой проблемы ... Если работа не удалась, я не могу просто добавить ее обратно во фьючерс.Поэтому я ищу более простой многопоточный процесс в Python.
Сводка:
Моя реализация параллельных фьючерсов требует, чтобы вы загружали список в указанное число потоков и передавали его исполнителю для отправки.Эта программа загружает множество URL-адресов из Redis и записывает DOM в файл.
Весь набор Redis читается как список в return_contents()
.
URLs = return_contents()
# print(URLs)
print('complete')
start = time.time()
# passing the urls to the threadpoolexecutor
with ThreadPoolExecutor(max_workers=20) as executor:
future_to_url = {executor.submit(load_url, url): url for url in URLs}
print('jobs are loaded')
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
completed = return_to_orig_names(url)
name_check = check_ismemeber_crawled(completed)
if name_check == 1:
print('############################## we are skipping {0} because it is in crawled urls'.format(completed))
pass
else:
try:
data = future.result()
html_data = str(data)
add_url_es(url, html_data, es)
add_completed_to_redis(completed)
except Exception as exc:
# if there is a max retry error then we need to add them to a different set in redis or to a file.
# we need to add this to a different set in redis
print('%r generated an exception: %s' % (url, exc))
print('we are going to add this back into the queue')
del future_to_url[future]
end = time.time()
print(end - start)
Я ищу что-то, что больше похоже на это ...
Псевдокод:
Если задан повторный URL-адрес: назначить работу для потока1, назначить работу для потока2, назначить работу для потока3 ... назначить работу для потока20.если задания возвращают действительные результаты: удалить из redis, еще: добавить обратно в redis
Что-то подобное должно существовать ...