Saya memiliki banyak masalah dengan sebagian besar jawaban yang diposting - mereka baik menggunakan perpustakaan yang sudah usang yang telah porting dengan fitur terbatas, atau memberikan solusi dengan sihir terlalu banyak pada pelaksanaan permintaan, sehingga sulit untuk menangani kesalahan. Jika mereka tidak termasuk dalam salah satu kategori di atas, itu adalah perpustakaan pihak ketiga atau sudah usang.
Beberapa solusi berfungsi dengan baik dalam permintaan http, tetapi solusi tersebut tidak memenuhi semua jenis permintaan lainnya, yang menggelikan. Solusi yang sangat khusus tidak diperlukan di sini.
Cukup menggunakan python built-in library asyncio
cukup untuk melakukan permintaan asinkronik dari jenis apa pun, serta memberikan fluiditas yang cukup untuk penanganan kesalahan kompleks dan usecase spesifik.
import asyncio
loop = asyncio.get_event_loop()
def do_thing(params):
async def get_rpc_info_and_do_chores(id):
# do things
response = perform_grpc_call(id)
do_chores(response)
async def get_httpapi_info_and_do_chores(id):
# do things
response = requests.get(URL)
do_chores(response)
async_tasks = []
for element in list(params.list_of_things):
async_tasks.append(loop.create_task(get_chan_info_and_do_chores(id)))
async_tasks.append(loop.create_task(get_httpapi_info_and_do_chores(ch_id)))
loop.run_until_complete(asyncio.gather(*async_tasks))
Cara kerjanya sederhana. Anda sedang membuat serangkaian tugas yang ingin Anda lakukan secara tidak sinkron, dan kemudian meminta loop untuk menjalankan tugas-tugas itu dan keluar setelah selesai. Tidak ada perpustakaan tambahan yang mengalami kekurangan pemeliharaan, tidak ada kekurangan fungsionalitas yang diperlukan.