Halo semua,
Saya sedang mengerjakan API yang mengirim beberapa permintaan, mengumpulkan hasil dan menggabungkan hasil dengan beberapa pemrosesan dan mengembalikan respons di suatu tempat. Saya menggunakan pekerja greenlet karena prosesnya jelas IO Bound.
Dari apa yang saya baca, setiap greenlet yang menangani permintaan gunicorn akan bertindak seperti utas, jadi setiap kali panggilan pemblokiran IO harus menunggu IO, greenlet akan memblokir untuk permintaan gunicorn tertentu. Jadi misalnya di handler aplikasi saya (menggunakan flask btw), saya punya beberapa requests.get(...)
greenlet akan memblokir sampai requests.get()
def fetch(pid):
response0 = requests.get('http://some-micro-service-0.com/')
response1 = requests.get('http://some-micro-service-1.com/')
response2 = requests.get('http://some-micro-service-2.com/')
return combine_response(response0, response1, response2)
Saya dapat menggunakan grequest untuk mencoba menambahkan lebih banyak konkurensi ke pawang, untuk meningkatkan latensi (yang merupakan sesuatu yang saya cari). Tetapi apakah Anda punya saran tentang cara melakukan ini?
Apakah Anda punya saran tentang bagaimana melakukan pengumpulan beberapa permintaan?
gevent memiliki contoh untuk mengirimkan beberapa permintaan secara paralel dan hanya melanjutkan setelah selesai.
(Kasus Anda akan sedikit berbeda, Anda akan mengembalikan response
alih-alih mencetaknya dan kemudian menggabungkannya.)
Tapi sebenarnya kita bisa lebih sederhana lagi menggunakan api Group.map
:
from gevent import pool
jobs = pool.Group()
responses = jobs.map(requests.get,
('http://one', 'http://two', 'http://three'))
Saya bisa menggunakan grequests untuk mencoba menambahkan lebih banyak konkurensi ke pawang,
grequests.map()
adalah versi singkatan dari potongan kode yang saya berikan di atas.
Selain itu, grequests
tidak banyak membantu. Ini terutama ada untuk menambal proses ketika diimpor, tetapi gunicorn sudah melakukannya.
menutup tiket karena tidak ada aktivitas yang terjadi di sana sejak beberapa saat.
Komentar yang paling membantu
grequests.map()
adalah versi singkatan dari potongan kode yang saya berikan di atas.Selain itu,
grequests
tidak banyak membantu. Ini terutama ada untuk menambal proses ketika diimpor, tetapi gunicorn sudah melakukannya.