Gunicorn: Menambahkan dukungan ASGI?

Dibuat pada 2 Nov 2016  ·  22Komentar  ·  Sumber: benoitc/gunicorn

Django Daphne sedang dalam pengembangan untuk mendukung ASGI, tetapi server Daphne sangat baru dan belum cocok untuk produksi (misalnya tidak ada dukungan SSL, masalah pematangan).

Apakah ada minat untuk menambahkan dukungan ASGI di GUnicorn untuk memungkinkan penggunaan WSGI/ASGI yang mulus?

- Mailing List -

Komentar yang paling membantu

Oke, bahas ini sekarang. (Sebagai kelas pekerja pihak ketiga.)

Uvicorn 0.2 tidak lagi bergantung pada gunicorn untuk menjalankannya secara langsung, tetapi menyertakan dua kelas pekerja gunicorn untuk menjalankan aplikasi ASGI.

Untuk pengembang lokal, atau kasus di mana Anda tidak cukup peduli dengan pengawasan proses, Anda dapat menjalankan uvicorn secara langsung. Untuk produksi, kami mendokumentasikan menggunakan kelas gunicorn sebagai opsi yang lebih disukai.

http://www.uvicorn.org/#running -with-gunicorn

Jalankan aplikasi ASGI dari gunicorn, menggunakan uvloop dan httptools:

gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker

Jalankan aplikasi ASGI dari gunicorn, menggunakan asyncio dan h11 (untuk kompatibilitas pypy):

gunicorn app:App -w 4 -k uvicorn.workers.UvicornH11Worker

Jika ada keinginan untuk membawa salah satu implementasi protokol ke dalam paket inti gunicorn maka saya sangat terbuka untuk mempertimbangkannya.

Semua 22 komentar

@arcivanov Saya akan melihat lebih dekat pada protokol ini untuk melihat apa yang perlu dilakukan untuk itu :)

Akan memperbarui tiket ini secepatnya.

ada pembaruan?

@benoitc @berkerpeksag dan saya mengobrol melalui email tentang hal itu. Belum ada pekerjaan yang dimulai, yang saya tahu. Saya belum sempat membaca lebih lanjut tentang ASGI, jadi saya tidak bisa memperkirakan kerumitan penerapannya. Jika ada yang ingin berkontribusi dalam pekerjaan ini, saya akan dengan antusias membantu, berdiskusi, dan mengulas.

Saya sedang dalam proses merombak spesifikasi ASGI agar lebih masuk akal untuk server, jadi saya berhati-hati untuk melakukan apa pun sampai selesai (spesifikasi baru sedang dirancang di sini, tetapi belum final sama sekali: http:/ /channels.readthedocs.io/en/2.0/asgi.html - pada dasarnya lebih mirip WSGI)

@andrewgodwin keren tidak sabar untuk mencoba gunicorn dengan asgi

@andrewgodwin apa status ASGI?

Saya baru-baru ini mencoba menguji aplikasi ASGI dan inilah yang saya dapatkan:

import json

def app(scope):
    async def channel(receive, send):
        message = await receive()

        if scope['method'] == 'POST':
            response = message
        else:
            response = scope

        await send({
            'type': 'http.response.start',
            'status': 200,
            'headers': [
                [b'Content-Type', b'application/json'],
            ],
        })
        await send({
            'type': 'http.response.body',
            'body': json.dumps(response, default=bytes.decode).encode(),
        })
        await send({
            'type': 'http.disconnect',
        })
    return channel
> daphne app:app
2018-03-31 22:28:10,823 INFO     Starting server at tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,824 INFO     HTTP/2 support enabled
2018-03-31 22:28:10,824 INFO     Configuring endpoint tcp:port=8000:interface=127.0.0.1
2018-03-31 22:28:10,825 INFO     Listening on TCP address 127.0.0.1:8000
127.0.0.1:43436 - - [31/Mar/2018:22:28:17] "GET /" 200 347
127.0.0.1:43440 - - [31/Mar/2018:22:28:22] "POST /" 200 43
127.0.0.1:43446 - - [31/Mar/2018:22:28:42] "POST /" 200 54
> http -b get :8000/
{
    "type": "http"
    "http_version": "1.1",
    "method": "GET",
    "path": "/",
    "query_string": "",
    "root_path": "",
    "scheme": "http",
    "headers": [
        ["host", "localhost:8000"],
        ["user-agent", "HTTPie/0.9.9"],
        ["accept-encoding", "gzip, deflate"],
        ["accept", "*/*"],
        ["connection", "keep-alive"]
    ],
    "client": ["127.0.0.1", 43360],
    "server": ["127.0.0.1", 8000],
}

> http -b -f post :8000/ foo=bar
{
    "body": "foo=bar",
    "type": "http.request"
}

> http -b -j post :8000/ foo=bar
{
    "body": "{\"foo\": \"bar\"}",
    "type": "http.request"
}

https://github.com/django/asgiref/blob/master/specs/www.rst

@sirex ASGI stabil sekarang. Saya tidak yakin apakah Anda mengatakan bahwa daphne mematuhi atau tidak memenuhi spesifikasi?

apakah tautan di Django yang terakhir tentang "spek" ASGI, atau adakah yang lebih menjelaskan alirannya?

@andrewgodwin Saya mencoba menunjukkan, bahwa jika Daphne mendukung ASGI, maka ASGI harus siap untuk diadopsi oleh kerangka kerja/server lain.

@benoitc ada dua halaman spesifikasi ASGI:

https://github.com/django/asgiref/blob/master/specs/asgi.rst - spesifikasi umum ASGI.

https://github.com/django/asgiref/blob/master/specs/www.rst - spesifikasi yang menjelaskan protokol HTTP dan WebSockets dan kompatibilitas dengan WSGI.

@sirex terima kasih. Meskipun spesifikasi ini tidak terlalu membantu dalam penerapannya.

Pokoknya saya telah menemukan https://channels.readthedocs.io/en/latest/ yang ok. Saya pikir saya lebih suka semangat, tetapi kami dapat mengusulkan sesuatu yang mendukung asgi segera setelah kami menghapus dukungan python 2.

btw Ideleted komentar terakhir karena tidak terkait dengan diskusi itu.

Saya belum pindah untuk menjadikan ASGI sebagai PEP karena saya ingin memastikannya memiliki dukungan umum yang cukup terlebih dahulu (dan proses itu membutuhkan banyak waktu dan usaha), tetapi itulah niatnya dan harus ditulis seperti itu.

kami dapat mengusulkan sesuatu yang mendukung asgi segera setelah kami menghapus dukungan python 2.

Jika Anda mulai berpikir tentang implementasi maka ada baiknya memulai dengan uvicorn , yang merekatkan gunicorn, uvloop, dan httptools. Mungkin masuk akal jika pekerjaan itu dikembalikan ke gunicorn sebagai kelas pekerja yang didukung di beberapa titik.

(Mungkin bagus bagi uvicorn untuk kemudian menjadi opsi yang lebih minimal, tanpa pemantauan proses, dll. yang disediakan gunicorn.)

Dokumentasi spesifikasi ASGI sekarang tersedia di sini: https://asgi.readthedocs.io/en/latest/.

Oke, bahas ini sekarang. (Sebagai kelas pekerja pihak ketiga.)

Uvicorn 0.2 tidak lagi bergantung pada gunicorn untuk menjalankannya secara langsung, tetapi menyertakan dua kelas pekerja gunicorn untuk menjalankan aplikasi ASGI.

Untuk pengembang lokal, atau kasus di mana Anda tidak cukup peduli dengan pengawasan proses, Anda dapat menjalankan uvicorn secara langsung. Untuk produksi, kami mendokumentasikan menggunakan kelas gunicorn sebagai opsi yang lebih disukai.

http://www.uvicorn.org/#running -with-gunicorn

Jalankan aplikasi ASGI dari gunicorn, menggunakan uvloop dan httptools:

gunicorn app:App -w 4 -k uvicorn.workers.UvicornWorker

Jalankan aplikasi ASGI dari gunicorn, menggunakan asyncio dan h11 (untuk kompatibilitas pypy):

gunicorn app:App -w 4 -k uvicorn.workers.UvicornH11Worker

Jika ada keinginan untuk membawa salah satu implementasi protokol ke dalam paket inti gunicorn maka saya sangat terbuka untuk mempertimbangkannya.

Sekarang gunicorn tidak mendukung python 2 lagi, secara teknis dapat dilakukan untuk menambahkan dukungan ASGI

@tomchristie Saya tertarik dengan tampilannya. Sebagai alternatif, mungkin mengekstrak protokol sebagai paket atau paket terpisah?

Saya tertarik dengan apa yang akan terlihat seperti. Sebagai alternatif, mungkin mengekstrak protokol sebagai paket atau paket terpisah?

Saya kira kelas pekerja di gunicorn yang bergantung pada uvicorn untuk protokol h11 dan/atau httptools. Atau duplikat implementasinya di sini.

Menduplikasi bagian terbatas dari implementasi untuk memberikan dukungan HTTP ASGI bawaan Gunicorn dengan ketergantungan h11 mungkin merupakan dasar yang baik?

mungkin mengekstrak protokol sebagai paket atau paket terpisah?

Tidak banyak yang bisa diekstraksi dari uvicorn - Jika kita menghapus click dan hanya menggunakan argparse, dan sedikit mengubah dependensi setup.py kita, maka tidak akan ada dependensi keras, dengan berbagai opsi untuk implementasi HTTP yang berbeda, implementasi WS, loop acara.

Saya ingin dukungan ASGI kelas satu, apakah itu berarti menambahkan dependensi ekstra di Gunicorn, pekerja rintisan yang memberi tahu Anda apa yang harus diinstal, dokumentasi, atau yang lainnya.

ya silahkan. mau pindah ke daphne dari gunicorn.. kalau gunicorn bisa support asgi
itu akan sangat menghemat waktuku.

@japrogramer http://www.uvicorn.org/#running -with-gunicorn

Django 3.0 (ditetapkan untuk rilis Desember 2019) akan memiliki dukungan ASGI di luar kotak , sehingga akan menjadi alasan bagus lainnya untuk gunicorn untuk mendukungnya secara langsung. Kami mungkin akan melihat peningkatan besar dalam minat pengguna setelah itu dirilis.

@johnthagen yang ada di pipa. Namun, kami perlu membersihkan sedikit tiket dan merilisnya bulan ini sebelum memulai.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat