Асинхронное программирование
Игра написана на Python 2.7, в котором отсутствует async/await, поэтому для асинхронного программирования используется библиотека adisp, позволяющая писать код в стиле async/await, используя корутины (генераторы).
adisp_process
Декоратор @adisp_process позволяет объявить процедуру как корутину, которая может использовать yield для ожидания завершения других асинхронных функций. Такая процедура не может возвращать значения.
python
from adisp import adisp_process
@adisp_process
def myAsyncFunction():
print('Before yield')
result = yield someAsyncFunction()
print('Result is:', result)
myAsyncFunction()adisp_async
Декоратор @adisp_async позволяет объявить функцию, которую можно ожидать в @adisp_process, и которая может вернуть результат асинхронной операции посредством вызова callback.
python
from adisp import adisp_process, adisp_async
@adisp_async
def someAsyncFunction(callback):
BigWorld.callback(1, lambda: callback(42)) # Симуляция асинхронной операции с задержкой
@adisp_process
def myAsyncFunction():
print('Before yield')
result = yield someAsyncFunction()
print('Result is:', result)
myAsyncFunction()Совмещение adisp_process и adisp_async
Декораторы @adisp_process и @adisp_async можно совмещать для создания сложных асинхронных цепочек.
python
from adisp import adisp_process, adisp_async
@adisp_async
def someAsyncFunction(callback):
BigWorld.callback(1, lambda: callback(42)) # Симуляция асинхронной операции с задержкой
@adisp_async
@adisp_process
def anotherAsyncFunction(callback):
print('Before yield in anotherAsyncFunction')
result = yield someAsyncFunction()
print('Result in anotherAsyncFunction is:', result)
callback(result * 2)
@adisp_process
def myAsyncFunction():
print('Before yield in myAsyncFunction')
result = yield anotherAsyncFunction()
print('Result in myAsyncFunction is:', result)
myAsyncFunction()
Andrei Soprachev