В чем ошибка при использовании асинхронности?

Есть задание: сгенерировать строку по заданному шаблону, а затем в 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)

Ответы (0 шт):