Полное руководство по модулю asyncio в Python. Часть 1
Python-модуль asyncio позволяет заниматься асинхронным программированием с применением конкурентного выполнения кода, основанного на корутинах. Хотя этот модуль имеется в Python уже много лет, он остаётся одним из самых интересных механизмов языка. Но asyncio , при этом, можно назвать ещё и одним из модулей, которые вызывают больше всего недоразумений. Дело в том, что начинающим разработчикам бывает трудно приступить к использованию asyncio .
Перед вами — подробное и всестороннее руководство по использованию модуля asyncio в Python. В частности, здесь будут рассмотрены следующие основные вопросы:
- Определение, создание и запуск корутин.
- Асинхронное программирование в Python.
- Организация неблокирующего ввода-вывода.
- Средства конкурентного программирования, используемые при работе с корутинами.
Оригинал этого руководства включает в себя 26 разделов. Сегодня, в первой части перевода, мы предлагаем вашему вниманию разделы №1 и 2.
1. Что такое асинхронное программирование
Асинхронное программирование — это концепция программирования, при применении которой запуск длительных операций происходит без ожидания их завершения и не блокирует дальнейшее выполнение программы.
Вместо этого запросы и вызовы функций производятся и выполняются в фоновом режиме, результаты их работы оказываются доступными не сразу, а через некоторое время. Это позволяет вызывающей стороне решать другие задачи, а результаты, ожидаемые после выполнения асинхронных вызовов, обрабатывать позже — либо тогда, когда они будут готовы, либо тогда, когда они понадобятся вызывающей стороне.
Прежде чем переходить к освоению asyncio — разберёмся с основами асинхронного программирования.
1.1. Асинхронные задачи
Слово «асинхронный» используют для описания неких процессов, не совпадающих друг с другом во времени. Его противоположность — слово «синхронный», используемое для описания чего-либо, точно совпадающего во времени.
В программировании смысл асинхронности в том, что когда делается запрос на выполнение некоего действия, это действие выполняется не в тот момент, когда делается запрос, а позже.
Асинхронный: раздельное выполнение потоков, которые могут выполняться конкурентно в любом порядке относительно друг друга, является асинхронным.
The Art of Concurrency, 2009, с. 265
При выполнении асинхронного вызова функции мы делаем запрос на выполнение вызова функции, но не ждём завершения этого вызова. А состояние вызванной функции или результаты её работы мы узнаём позже.
Асинхронный вызов функции — это запрос на вызов функции, выполняемый неким образом в некий момент времени, при этом вызывающая сторона, после выполнения вызова, может продолжать работу и решать другие задачи.
Получается, что вызов функции будет выполнен в некий момент времени, в фоновом режиме, а программа может решать какие-то задачи или реагировать на некие события.
В этом — вся суть. Мы не осуществляем контроль над тем, как или когда будет обработан запрос. Мы лишь сообщаем системе о том, что нам нужно, чтобы запрос был бы обработан тогда, когда наша программа занимается какими-то другими делами.
Выполнение асинхронного вызова функции часто приводит к предоставлении вызывающей стороне некоего идентификатора запроса, который вызывающая сторона может использовать для того, чтобы проверить состояние запроса или получить результаты. Такие идентификаторы часто называют объектами, ждущими результата выполнения задачи (future, объект Future, преднамеченное значение, «футура»).
Объект future: идентификатор асинхронного вызова функции, позволяющий проверять состояние вызова и получать результаты работы функции.
Комбинацию асинхронного вызова функции и объекта Future часто называют асинхронной задачей. Это так из-за того, что такая комбинация даёт больше возможностей, чем обычный вызов функции. Например — позволяет отменять запрос и выполнять другие действия.
Асинхронная задача: этот термин используется для обозначения сущности, представляющей собой объединение асинхронного вызова функции и порождённого этим вызовом объекта Future .
1.2. Асинхронное программирование
Формирование асинхронных задач и выполнение асинхронных вызовов функций называют асинхронным программированием.
Итак — что такое асинхронное программирование? Его смысл в том, что особые длительные задачи можно запустить в фоне, отдельно от главного приложения. Вместо того чтобы блокировать весь остальной код приложения, заставляя его ждать завершения этих длительных задач, система получает возможность выполнять другие действия, не зависящие от этих задач. Затем, после завершения длительной задачи, мы получим уведомление об этом и сможем обработать результат.
Python Concurrency with asyncio, 2022, с. 3
Асинхронное программирование: использование особых приёмов асинхронного выполнения кода — таких, как выполнение асинхронных задач или вызовов функций.
Приёмы асинхронного программирования используются, в основном, в системах, предусматривающих применение неблокирующих операций ввода/вывода. Это, например, чтение данных из сокета или их запись в сокет при работе с другими процессами или системами.
Когда мы, в неблокирующем режиме, пишем данные в сокет, мы можем просто инициировать соответствующую операцию, действуя по принципу «выстрелил и забыл», а наше приложение может перейти к выполнению других задач.
Python Concurrency with asyncio, 2022, с. 18
Неблокирующий ввод/вывод — это когда программа запрашивает у системы чтение или запись неких данных, а соответствующие операции выполняются асинхронно. Вызывающей стороне не нужно ждать завершения операции перед переходом к другим задачам.
Операции чтения и записи выполняются тем или иным образом (например — операционной системой, или некими системами, построенными на её основе), а сведения о состоянии операций и/или данные, полученные в ходе их выполнения, вызывающая сторона получает позднее, как только они будут готовы, или когда вызывающая сторона готова будет их принять.
Неблокирующая обработка ввода/вывода: выполнение операций ввода/вывода посредством асинхронных запросов и ответов, а не таким образом, который предусматривает ожидание завершения операции.
Таким образом — можно видеть, как неблокирующий ввод/вывод связан с асинхронным программированием. На самом деле, мы либо используем неблокирующий ввод/вывод через механизмы асинхронного программирования, либо неблокирующий ввод/вывод реализован посредством таких механизмов.
Комбинация неблокирующего ввода/вывода с асинхронным программированием так распространена, что её обычно называют асинхронным вводом/выводом.
Асинхронный ввод/вывод: условное сокращение, которое означает комбинацию асинхронного программирование и неблокирующей обработки ввода/вывода.
Теперь давайте разберёмся с асинхронным программированием в Python.
1.3. Асинхронное программирование в Python
В широком смысле асинхронное программирование в Python — это выполнение запросов без блокировки основной программы ради ожидания их завершения.
Асинхронные механизмы в Python можно реализовать разными способами, но при этом некоторые из них лучше других соответствуют модели конкурентности Python.
Первый и наиболее очевидный подход к разработке асинхронных Python-программ заключается в применении модуля asyncio. Этот модуль напрямую предлагает программисту среду для асинхронного программирования, в которой используется синтаксическая конструкция async/await и неблокирующий ввод/вывод с применением сокетов и подпроцессов.
Название модуля asyncio — это сокращение от asynchronous I/O (асинхронный ввод/вывод). Это — Python-библиотека, которая позволяет нам выполнять код, используя модель асинхронного программирования. Такой подход даёт возможность одновременно обрабатывать несколько операций ввода/вывода, а приложение при этом не теряет возможности реагировать на внешние воздействия.
Python Concurrency with asyncio, 2022, с. 3
Всё это реализовано с использованием корутин. Они выполняются в цикле событий, а сам он выполняется в единственном потоке.
Asyncio: асинхронная среда программирования, представленная в Python благодаря модулю asyncio .
Если говорить о других подобных механизмах — то в Python можно работать с потоками и процессами, которые способны асинхронно выполнять задачи.
Например, один поток может запустить другой поток для выполнения вызова функции, а после этого продолжить выполнять другие действия. Операционная система запланирует и выполнит второй поток в некий момент времени, а первый поток может, по желанию программиста, проверить состояние задачи, или может этого не делать.
Потоки асинхронны, то есть — они могут работать с разными скоростями, и любой поток может в любой момент остановиться на время, длительность которого заранее неизвестна.
The Art of Multiprocessor Programming, 2021, с. 76
А точнее — Python даёт в наше распоряжение пулы потоков и процессов, основанные на концепции исполнителей. Реализовано это, соответственно, посредством классов ThreadPoolExecutor и ProcessPoolExecutor.
Эти классы используют одинаковый интерфейс и поддерживают асинхронные задачи с помощью метода submit() , который возвращает объект Future .
Модуль concurrent.futures предоставляет высокоуровневый интерфейс для асинхронного выполнения вызываемых объектов. Асинхронное выполнение объектов может быть произведено с помощью потоков — посредством ThreadPoolExecutor, или с помощью отдельных процессов — посредством ProcessPoolExecutor.
concurrent.futures — Launching parallel tasks
Модуль multiprocessing тоже предоставляет пулы воркеров, использующие процессы и потоки, посредством классов Pool и ThreadPool. Это — предшественники классов ThreadPoolExecutor и ProcessPoolExecutor .
Возможности этих классов описываются в терминах воркеров, асинхронно выполняющих задачи. Они явным образом предоставляют синхронные (блокирующие) и асинхронные (неблокирующие) версии каждого метода для выполнения задач.
Например, можно запустить функцию, предназначенную для особого случая, либо сделав это синхронно, воспользовавшись методом apply() , либо асинхронно — с помощью метода apply_async() .
Объект пула процессов управляет пулом процессов-воркеров, которым можно отправлять задания. Он поддерживает асинхронную выдачу результатов с использованием тайм-аутов или коллбэков и имеет параллельную реализацию метода map().
multiprocessing — Process-based parallelism
Существует один аспект асинхронного Python-программирования, который менее жёстко связан с реализацией конкурентности в Python.
Например, Python-процессы асинхронно принимают или обрабатывают сигналы. Сигналы — это, по своей сути, асинхронные события, отправляемые из одних процессов другим процессам.
Этот механизм, в основном, поддерживается благодаря модулю signal.
Теперь, когда мы разобрались с тем, что такое асинхронное программирование, поближе присмотримся к asyncio .
2. Что такое asyncio
В Python понятие «asyncio», в широком смысле, означает возможность реализации механизмов асинхронного программирования с использованием корутин.
Если говорить конкретнее, то понятие «asyncio» имеет отношение к двум элементам:
- Добавление модуля asyncio в стандартную библиотеку Python в Python 3.4.
- Добавление выражений async/await в языковой арсенал Python в Python 3.5.
Всё это вместе — модуль и изменения, внесённые в язык — обеспечило возможность разработки Python-программ, поддерживающих конкурентное выполнение кода, основанное на корутинах, позволило использовать неблокирующий ввод/вывод и механизмы асинхронного программирования.
В Python 3.4 появилась библиотека asyncio, а в Python 3.5 — ключевые слова async и await, позволяющие удобно работать с этой библиотекой. Эти новшества языка открыли дорогу так называемому «асинхронному программированию».
Using Asyncio in Python, 2020, с. VII
Рассмотрим подробнее эти два аспекта asyncio , начав с изменений, внесённых в язык.
2.1. Изменения, внесённые в Python для добавления в язык поддержки корутин
Языковые возможности Python изменились для того, чтобы приспособить язык к работе с модулем asyncio . Сделано это посредством добавления в Python новых выражений и типов данных.
Точнее — язык изменился ради обеспечения стандартной поддержки корутин. А корутины, в свою очередь, являются компонентом системы конкурентного выполнения кода. Этот компонент используется в программах, в которых применяется модуль asyncio .
Корутина — это функция, выполнение которой можно приостановить и возобновить.
Корутина: корутины — это более общая форма подпрограмм. Подпрограммы имеют одну точку входа и одну точку выхода. А корутины поддерживают множество точек входа, выхода и возобновления их выполнения.
Python glossary
Корутину можно определить с использованием выражения async def . Она может принимать аргументы и возвращать значение — так же, как и функция.
# определение корутины async def custom_coro(): # .
Вызов функции корутины создаёт объект корутины, в основе которого лежит новый класс. При этом функция корутины не выполняется.
. создание объекта корутины coro = custom_coro()
Корутина может запустить другую корутину посредством выражения await .
Это выражение приостанавливает выполнение вызывающей стороны и планирует выполнение целевого объекта.
. приостановить выполнение кода и запланировать выполнение целевого объекта await custom_coro()
Асинхронный итератор — это итератор, который выдаёт объекты, допускающие ожидание.
Асинхронный итератор: объект, который реализует методы aiter() и anext(). Метод anext() должен возвращать объект, допускающий ожидание. Конструкция async for разрешает объекты, допускающие ожидание, возвращённые методом anext() асинхронного итератора до тех пор, пока он не вызовет исключение StopAsyncIteration.
Python glossary
Асинхронный итератор можно обойти, используя выражение async for .
. обход асинхронного итератора async for item in async_iterator: print(item)
Применение этой конструкции не приводит к параллельному выполнению цикла for .
Вместо этого вызывающая корутина, которая выполняет цикл for , будет приостанавливаться и самостоятельно ожидать каждый объект, допускающий ожидание, полученный из итератора.
Асинхронный менеджер контекста — это менеджер контекста, который может приостанавливать выполнение в своих методах enter и exit.
Asynchronous Context Managers and «async with»
Выражение async with используется для создания и использования асинхронных менеджеров контекста.
Вызывающая корутина приостановится и подождёт менеджер контекста до входа в блок менеджера и похожим образом поступит при выходе из блока менеджера контекста.
Это — сводка основных изменений, внесённых в Python для поддержки корутин.
Теперь поговорим о модуле asyncio .
2.2. Модуль asyncio
Модуль asyncio даёт нам функции и объекты для разработки программ, основанных на корутинах с использованием парадигмы асинхронного программирования.
В частности, этот модуль поддерживает неблокирующую обработку ввода/вывода с использованием подпроцессов (для выполнения команд) и с использованием потоков (для программирования TCP-сокетов).
Asyncio — это библиотека для написания конкурентного кода с использованием синтаксических конструкций async/await.
asyncio — Asynchronous I/O
Центральной концепцией модуля asyncio является цикл событий.
Это — механизм, который выполняет программы, основанные на корутинах, и реализует кооперативную многозадачность корутин.
Цикл событий — это база любого asyncio-приложения. Цикл событий выполняет асинхронные задачи и коллбэки, сетевые операции ввода/вывода, подпроцессы.
Event Loop
Этот модуль предоставляет и высокоуровневый, и низкоуровневый API.
Высокоуровневый API предназначен для разработчиков Python-приложений. А низкоуровневый API — преимущественно для разработчиков фреймворков, но, в большинстве случаев, не для разработчиков приложений.
Большинство вариантов использования asyncio реализуются с использование высокоуровневого API, который даёт в распоряжение программистов инструменты для работы с корутинами, потоками, примитивами синхронизации, подпроцессами и очередями, предназначенными для разделения данных между корутинами.
Низкоуровневый API — это основа высокоуровневого API, в его состав входят внутренние механизмы цикла событий, транспортные протоколы, политики и другие механизмы.
Теперь мы, в общих чертах, разобрались с тем, что такое asyncio , и с тем, что этот модуль предназначен для асинхронного программирования на Python.
Далее — поговорим о том, что нужно принимать во внимание при использовании asyncio в своих Python-программах.
О, а приходите к нам работать?
Мы в wunderfund.io занимаемся высокочастотной алготорговлей с 2014 года. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.
Мы предлагаем интересные и сложные задачи по анализу данных и low latency разработке для увлеченных исследователей и программистов. Гибкий график и никакой бюрократии, решения быстро принимаются и воплощаются в жизнь.
Сейчас мы ищем плюсовиков, питонистов, дата-инженеров и мл-рисерчеров.
Async Art
Async Art – новое направление в искусстве. Здесь можно купить цифровые картины, разбитые на слои, которые можно редактировать и отключать.
649 Mission St, 5-й эт., Сан-Франциско, Калифорния, 94105
Справочный центр [email protected] Twitter Discord
Английский
Asynchronous Art, Inc.
Изобразительное искусство, Музыка
Defiantsquid, Bottles, Async Art, XCOPY
Криптовалюты, Банковская карта (Visa/MC)
Криптовалюты, Банковская карта (Visa/MC)
Холодный: нет
Горячий: нет
От 20 до 30 % C продажи
Платформа для создания Арт Токенов онлайн, есть собственные инструменты для художников
Ограничений по регистрации нет
Блог, Центр поддержки, Видеоинструкции, Вакансии
Нет мобильных приложений
Уникальные инструменты
Только для популярных художников
Регистрация по электронному кошельку
Популярная платформа среди коллекционеров
Защита покупателя и продавца
Бесплатное размещение работ
Мало поддерживаемых криптовалют
Базовая верификация по почте, логину и паролю
Контролирующие органы США
Роскомнадзор
Юридическое наименование: Asynchronous Art, Inc.
Юридический адрес: 649 Mission St, 5-й эт., Сан-Франциско, Калифорния, 94105
Еще по теме
10 августа 2022
27 июля 2022
13 декабря 2021
649 Mission St, 5-й эт., Сан-Франциско, Калифорния, 94105
Подписаться на эту компанию
Отзывы
Async Art отзывы
Ещё нет отзывов, будьте первым!
Компания в рейтингах
Рейтинг Место
Биржи криптовалют
Компания Место
Роботы для криптовалюты
Компания Место
Компания Место
Активность
- Новые 1
- Решено 0
- Не решено 1
Новые компании на сайте
- NFT-маркетплейсы
- NFT-маркетплейсы
- NFT-маркетплейсы
etorazvod.ru — это крупный информационный сервис обзоров и отзывов о компаниях, которые у всех на слуху и не только. Размещайте жалобы, отзывы и обзоры на компании. Это неоценимо полезно!
Быстрые ссылки
Изучите все категории
Покупки в интернете
- Аптеки и доставка лекарств
- Интернет-магазины
- Одежда, обувь и аксессуары
- Цифровая и бытовая техника
- Спорт
- Доставка еды
- Популярные товары
- Сервисы доставки
Обучение и работа
- Курсы по обучению
- Онлайн-школы
- Изучение иностранных языков
- Курсы IT и digital
- Маркетинг и продажи
- Репетиторство
- Красота и здоровье
- Сервисы по поиску работы
- Сетевой маркетинг
- Университеты
Услуги для бизнеса
- Расчетно-кассовое обслуживание
- Эквайринг
- CRM-системы
- Электронный документооборот
- Юридические компании
- Консалтинговые компании
- Аудиторские компании
- Бухгалтерия онлайн
- Онлайн-кассы
Кредиты и займы
- Потребительские кредиты
- Кредитные карты
- Дебетовые карты
- Микрофинансовые организации
- Подбор кредита
- Улучшение кредитной истории
- Платежные системы
Путешествия и страхование
- Путешествия
- Покупка билетов
- Бронирование отелей
- Санатории
- Бронирование автомобилей
- Страхование онлайн
- Авиакомпании
- Туроператоры
Продвижение и реклама
- Регистраторы доменов
- Хостинг компании
- Продвижение в социальных сетях
- SEO-сервисы
- Тизерные и рекламные сети
- Аналитика
- Конструкторы сайтов
- Чаты и чат-боты для сайта
- Партнерские сети
- Блогеры
Финансовые рынки
- Брокеры фондового рынка
- Криптовалютные биржи
- Роботы для криптовалюты
- Покупка электронных валют
- Обменники электронных валют
- Криптокошельки
- NFT-маркетплейсы
- NFT-игры
- Криптовалюты
- DeFi-проекты
- Майнинг пулы
Знакомства и развлечения
- Знакомства в Интернете
- Букмекерские конторы
- MMO и RPG игры
- Провайдеры и сотовые операторы
- Антивирусы
- VPN-сервисы
- Программы для фото и видео
- Застройщики
- Управляющие компании
- Автодилеры
- Доски объявлений
- Медицинские услуги
- Стоматологические клиники
- Фитнес-центры
- Сайты отзывов
- Продажа майнингого оборудования
- Жалобы на компании
- Онлайн сервисы
- Обучение онлайн
- Туризм
- Советы юристов
- Интернет-магазины
- Фондовый рынок
- Криптовалюта
- Ставки на спорт
- Кредиты и займы
- Бонусы и акции
- Видео
- Разное
Программируемая арт-платформа Async обеспечивает начальное финансирование на сумму более 2 миллионов долларов
Async Art стремится возглавить движение программируемого искусства с новым раундом финансирования.
Async Art, платформа нефинансовых токенов Кремниевой долины, получила начальное финансирование на сумму более 2 миллионов долларов от как минимум 10 инвесторов, что подчеркивает растущую ценность предложения программируемого искусства.
Компания объявила о новом повышении в среду, подчеркнув быстрый рост Async с момента его запуска в феврале 2020 года. За первый год работы Async выручила от продаж произведений искусства на сумму более 1 миллиона долларов и запустила приложение Smart TV для демонстрации цифрового искусства.
Хотя компания не указала, как она будет использовать средства, она указала, что привлечение новых пользователей и создание новых дисплеев были в центре внимания. Async также стремится расширить свои вакансии. В настоящее время на его странице в LinkedIn есть вакансии для менеджера сообщества и разработчика приложений.
В начальном раунде приняли участие не менее 10 инвесторов: Lemniscap, Galaxy Interactive, Signum Growth Capital, Semantic, Blue Wire Capital, Collab + Currency , Inflection, Divergence Ventures, LAO и Placeholder.
Async описал программируемое искусство как «новое движение», которое позволяет создателям «деконструировать свою работу на« слои »и наделить их способностями».
Lemniscap, один из основных элементов Async Art инвесторы назвали СМИ следующим рубежом разрушения:
«Обеспечивая совместное владение произведениями искусства и динамическое влияние на их внешний вид, Async Art переворачивает существующую концепцию искусства с ног на голову и прокладывает путь к совершенно новая категория программируемых носителей ».
Асинхронность также была представлена на Christie’s, крупном аукционном доме, который планирует предлагать отдельные работы NFT в конце этого месяца. Ноа Дэвис, специалист Christie’s по искусству, недавно сказал, что NFT« переживают стремительный рост за последние несколько лет — особенно в последние несколько месяцев ».
Async также показал иллюстрацию Мэтта Кейна« В нужное место и в нужное время »в марте 2020 года, что помогло ему занять место в сотне лучших Cointelegraph. произведение искусства, которое динамично развивается в ответ на волатильность цены биткойнов (BTC), считается шедевр в зарождающейся нише NFT.
Пионер Web3, платформа Async Art объявляет о закрытии
Платформа для авторов Async Art официально объявила о своем закрытии, сигнализируя об окончании своего влиятельного присутствия в сообществе Web3. В заявлении, опубликованном 23 октября, команда Async Art подробно рассказала о своих планах прекратить деятельность в ближайшие месяцы.
Медвежий рынок принимает очередную жертву
С момента своего создания в 2020 году Async Art послужила важной силой художественных инноваций, предоставляя художникам и музыкантам по всему миру надежную платформу для демонстрации своих талантов и продажи своих работ.
Async Art представила новые концепции в индустрии NFT, позволив художникам создавать многослойные, динамичные произведения искусства, которые развивались с течением времени или под влиянием коллекционеров. Одна примечательная особенность — система Blueprints — позволяет создавать генеративные NFT без кода. Выдающиеся проекты, такие как «Grifters» XCOPY и «Across the Face» Osinachi’s, родились именно из этого нововведения.
Генеральный директор взвешивает
Конлан Риос, генеральный директор Async, поделился своим мнением о решении о закрытии, отметив изменившуюся ситуацию в мире NFT:
«Когда мы запустили его в феврале 2020 года, мир NFT был меньше и проще. Все знали друг друга и вокруг царило настоящее чувство альтруизма».
Однако путь принял другой оборот, когда сектор NFT взорвался. Риос рассказал о переходе от коллекционера произведений искусства к оператору платформы и руководителю группы, а также о менее чем привлекательных аспектах, с которыми они столкнулись по мере изменения динамики отрасли.
Что произойдет с существующими асинхронными NFT
Что касается существующих NFT, это дает некоторую уверенность художникам и коллекционерам. Все асинхронные NFT надежно закреплены в IPFS, популярной децентрализованной сети хранения, сохраняя свое присутствие в цепочке. Однако Async Market прекратит закупки к концу 2023 года, а с 23 октября Async Art больше не будет принимать новые материалы.
Риос пообещал более подробную информацию в ближайшие недели, подчеркнув свое намерение «сохранить работы, созданные с помощью платформы, и обеспечить, чтобы оставшиеся члены ее команды нашли новый дом, чтобы продолжать заниматься своими web3-увлечениями».
Искусство Web3 будет жить
Несмотря на закрытие платформы, команда Async Art по-прежнему с оптимизмом смотрит на будущее динамичного и генеративного искусства в области web3. «Мы уверены, что это движение будет жить благодаря духу создателей и создателей Web3», — подтвердили они в своем прощальном заявлении.
Сфера криптоарта готова помнить новаторский вклад Async Art и продолжать развиваться. Но Async Art не одинок в своем уходе. Ранее в этом месяце другая платформа NFT, Versum, объявила о своем закрытии после объявления о закрытии Nifty в августе.