Можно. Используйте для этого встроенные модули threading или multiprocessing

А если серьезно, то зависит от того, что Вы понимаете под “асинхронностью”: если это Event-driven programming, то, как понятно из названия, нужно что-то, что будет вызывать эти самые события (events).
С точки зреня компьютерного “железа”, события как правило вызывают устройства, например сетевая карта при получении новой порции данных. При этом срабатывает
прерывание, которое передает управление
обработчику прерываний.
Немного о том, что такое прерывание:
https://ru.wikipedia.org/wiki/%CF%F0%E5%F0%FB%E2%E0%ED%E8%E5При загрузке, каждая операционная система строит свою собственную
таблицу прерываний. Всё это происходит в рамках загрузки драйверов устройств.
Далее обработчики прерываний могут генерировать системные события, в зависимости от архитектуры системы.
Вот в этом процессе обработки прерываний как раз и заключается та самая “асинхронность”, т.к. процессор при каждом таком прерывании приостанавливает свою работу и переключается на выполнение обработчика прерываний.
Таким образом можно сделать вывод, что для того, чтобы получить доступ к этим самым системным event'ам, нужно напрямую общаться с ядром системы. В случае с Unix почитайте про системные вызовы select, poll и т.д. Под Windows, насколько я помню, подобные вызовы “зашиты” в функционал WinSock.
В Python имеется модуль для подобного общения с ОС. Называется select:
https://docs.python.org/2/library/select.htmlПосмотрите документацию, там осуществляются системные вызовы select/poll/epoll. Под Windows, судя по документации, работать будет только с сетевыми сокетами (WinSock).
Подводя итоги, посоветую Вам почитать про эти системные вызовы и про то, как работает компьютерное железо в целом. Тогда Вы сможете для себя уяснить принципы работы того самого асинхронного программирования.
Также советую закинуть в копилку знаний информацию о том, как работает многопоточность и многопроцессность. Это всё очень рядом с базовыми принципами работы ОС.