Saya punya masalah dengan penggunaan asyncio. Di mana setiap pemanggilan fungsi harus berjalan dengan event loop. Saya tidak menyukainya, karena akan membuat kode saya panjang dan tidak efisien. Saya pikir jika menggunakan dekorator akan menyederhanakan kode saya dan bekerja cepat dengan async. Ini adalah dekorator sederhana saya yang akan membungkus fungsi async dan dipanggil dengan event loop.
import asyncio
def static_async(method):
def wrapper(*args, **kwargs):
event = asyncio.new_event_loop()
asyncio.set_event_loop(event)
event.run_until_complete(method(*args, **kwargs))
event.close()
return wrapper
def dynamic_async(method):
def wrapper(*args, **kwargs):
event = asyncio.new_event_loop()
asyncio.set_event_loop(event)
task = (method(*args, **kwargs),)
result = event.run_until_complete(asyncio.gather(*task))
event.close()
return result[0]
return wrapper
Saya punya dua fungsi, yang pertama adalah static_async, fungsi static_async akan memanggil fungsi async tanpa mengembalikan nilai atau hanya dipanggil saja. Yang kedua dynamic_async akan memanggil fungsi async dengan mengembalikan hasil dari fungsi tersebut. Contoh penggunaannya:
import asyncio
def static_async(method):
def wrapper(*args, **kwargs):
event = asyncio.new_event_loop()
asyncio.set_event_loop(event)
event.run_until_complete(method(*args, **kwargs))
event.close()
return wrapper
def dynamic_async(method):
def wrapper(*args, **kwargs):
event = asyncio.new_event_loop()
asyncio.set_event_loop(event)
task = (method(*args, **kwargs),)
result = event.run_until_complete(asyncio.gather(*task))
event.close()
return result[0]
return wrapper
@static_async
async def static_fun():
for i in range(0, 10):
print('Printed of {}'.format(i))
@dynamic_async
async def dynamic_fun(x):
result = 0
for i in range(0, 10):
result += i * x
return result
print('--- Running static function ---')
static_fun()
print('--- Running dynamic function ---')
result_dynamic = dynamic_fun(2)
print(result_dynamic)
--- Running static function ---
Printed of 0
Printed of 1
Printed of 2
Printed of 3
Printed of 4
Printed of 5
Printed of 6
Printed of 7
Printed of 8
Printed of 9
--- Running dynamic function ---
90
Sekarang kamu bisa menggunakan fungsi asynchronous dengan senang.
Comments