Сергей Горностаев, Есть рабочий код, в котором асинхронно делаются запросы к списку сайтов (из файла в нём указаны каждый на новой строке без пробелов):
import asyncio
import time
import cached
import httpx
from cachetools import cached, TTLCache
FILE_NAME = "/home/user/IdeaProjects/python_async_pytest/dir_async/urls.txt"
@cached(cache=TTLCache(maxsize=100, ttl=60))
async def fetch_url(url, queue_errors) -> (int, str):
async with httpx.AsyncClient(timeout=10) as client:
try:
response = await client.get(url)
except Exception as error:
await queue_errors.put(url)
return error
else:
return response.status_code, response.text
async def async_main(file_name):
queue_errors = asyncio.Queue()
start = time.time()
with open(file_name, "r") as f:
urls_before = f.read().splitlines()
urls = ["https://www." + url for url in urls_before]
tasks = [fetch_url(url, queue_errors) for url in urls]
results = await asyncio.gather(*tasks)
total_responses = len(results)
end_time = round(time.time() - start, 2)
urls_with_request_error = []
for i in range(queue_errors.qsize()):
urls_with_request_error.append(await queue_errors.get())
print()
print(end_time, "seconds")
print("Total responses:", total_responses)
print("Total successful responses:", total_responses - queue_errors.qsize())
print("Total failed responses:", queue_errors.qsize())
return results, urls_with_request_error
if __name__ == "__main__":
asyncio.run(async_main(FILE_NAME))
Т.к. asynс разделяет 1 поток между работающими программами (корутинами), то пришла мысль сделать работу данной программы на каждом ядре и обойти ограничение в один поток, однако, столкнулся с ошибкой серилизации (писал выше в вопросе).
Возможно, я понимаю не всё (и/или не так) в параллельном программировании в python, поэтому буду удовлетворен ответом на вопрос ниже - можно ли ускорить эту программу выше путем реального распараллеливания (а не только конкурентного использования 1 потока) именно в python.
Everything_is_bad, Я понимаю, что multiprocessing связан с многоядерностью. Просто, модуль async работает в одном потоке, а хотелось бы использовать корутину одну и туже, сразу в нескольких потоках. Т.е. на каждом ядре через multiprocessing, например, шли асинхронные запросы к сайтам, а не только на 1 ядре, как есть в async.
Т.е. невозможно использовать на нескольких ядрах одну и туже async функцию, тем самым распаралеливая вычисления?
Покидание границы процессов - это, в частности, может быть запрос к внешнему, относительно ОС, ресурсу (сайту)?
Т.к. asynс разделяет 1 поток между работающими программами (корутинами), то пришла мысль сделать работу данной программы на каждом ядре и обойти ограничение в один поток, однако, столкнулся с ошибкой серилизации (писал выше в вопросе).
Возможно, я понимаю не всё (и/или не так) в параллельном программировании в python, поэтому буду удовлетворен ответом на вопрос ниже - можно ли ускорить эту программу выше путем реального распараллеливания (а не только конкурентного использования 1 потока) именно в python.