Gunicorn: Pertanyaan tentang proses terikat IO dengan pekerja gevent

Dibuat pada 15 Apr 2019  ·  3Komentar  ·  Sumber: benoitc/gunicorn

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?

Komentar yang paling membantu

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.

Semua 3 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat