В чем ошибка при использовании асинхронности?
Есть задание: сгенерировать строку по заданному шаблону, а затем в 100 текстовых файлов записать по 100к таких строк. Файлы заполняю с помощью библы multiprocessing, этот способ вышел быстрее многопоточности, а файловой асинхронности в питоне нет, как мне сказали в другом вопросе. Строки генерировал без использования каких-либо библиотек и все работало как надо. Чтобы ускорить процесс решил прикрутить асинхронность, и теперь программа работает бесконечно, то есть когда в файл записано уже 100к строк, она продолжает работать. Подскажите, как исправить этот трабл с асинхронностью? Я в ней новичок, поэтому не знаю, что сделал не так.
Код записи в файлы
from part_1.random_generator import final_string
from time import monotonic, time
import threading
import multiprocessing as mp
def write_file(filename):
t = monotonic()
with open(filename, 'w', encoding='utf-8') as file:
for _ in range(100000):
file.write(final_string())
print(monotonic() - t)
if __name__ == '__main__':
"""Multiprocessing"""
t = monotonic()
mp.set_start_method('spawn')
processes = [mp.Process(target=write_file, args=(f'files/file_{index}.txt',)) for index in range(100)]
for process in processes:
process.start()
# process.join()
print(monotonic() - t)
Код генерации строк
import random
import string
from datetime import datetime, timedelta
import asyncio as asc
now = datetime.now()
full_string = []
async def random_date():
needed_date = now - timedelta(days=(365*5+1)*random.random())
full_string.append(needed_date.strftime('%d.%m.%Y'))
# return needed_date.strftime('%d.%m.%Y')
async def random_latin():
full_string.append(''.join(random.choice(string.ascii_letters) for _ in range(10)))
# return ''.join(random.choice(string.ascii_letters) for _ in range(10))
async def random_cyrillic():
cyrillic_letters = 'АОЕЯИЮУЁЭЫуеёоыаэяию'
full_string.append(''.join(random.choice(cyrillic_letters) for _ in range(10)))
# return ''.join(random.choice(cyrillic_letters) for _ in range(10))
async def random_number():
full_string.append(str(random.randint(1, 100000000)))
# return str(random.randint(1, 100000000))
async def random_float():
full_string.append('{:.8f}//\n'.format(random.uniform(1, 20)))
# return '{:.8f}'.format(random.uniform(1, 20))
async def collect_parts():
date_task = asc.create_task(random_date())
latin_task = asc.create_task(random_latin())
cyrillic_task = asc.create_task(random_cyrillic())
number_task = asc.create_task(random_number())
float_task = asc.create_task(random_float())
def final_string():
asc.run(collect_parts())
return '//'.join(full_string)