Saya mencoba sampel yang disediakan dalam dokumentasi pustaka permintaan untuk python.
Dengan async.map(rs)
, saya mendapatkan kode respons, tetapi saya ingin mendapatkan konten dari setiap halaman yang diminta. Ini, misalnya, tidak berfungsi:
out = async.map(rs)
print out[0].content
requests-threads
ada sekarang.Jawaban:
Catatan
Jawaban di bawah ini tidak berlaku untuk permintaan v0.13.0 +. Fungsionalitas tidak sinkron dipindahkan ke grequests setelah pertanyaan ini ditulis. Namun, Anda bisa saja menggantinya
requests
dengangrequests
bawah ini dan itu akan berfungsi.Saya telah meninggalkan jawaban ini untuk mencerminkan pertanyaan awal yang tentang menggunakan permintaan <v0.13.0.
Untuk melakukan banyak tugas dengan
async.map
asinkron Anda harus:async.map
daftar semua permintaan / tindakanContoh:
sumber
from grequests import async
jangan bekerja .. dan definisi kerja dosomething ini bagi sayadef do_something(response, **kwargs):
, saya menemukannya dari stackoverflow.com/questions/15594015/…from requests import async
denganimport grequests as async
bekerja untuk saya.async
sekarang modul independen:grequests
.Lihat di sini: https://github.com/kennethreitz/grequests
Dan di sana: Metode ideal untuk mengirim beberapa permintaan HTTP melalui Python?
instalasi:
pemakaian:
membangun tumpukan:
kirim tumpukan
hasilnya terlihat seperti
grequests tampaknya tidak menetapkan batasan untuk permintaan bersamaan, yaitu ketika beberapa permintaan dikirim ke server yang sama.
sumber
results = grequests.map(rs)
kode setelah baris ini diblokir, saya dapat melihat efek async?Saya menguji permintaan-futures dan grequest . Grequests lebih cepat tetapi membawa tambalan monyet dan masalah tambahan dengan dependensi. request-futures beberapa kali lebih lambat dari grequests. Saya memutuskan untuk menulis permintaan saya sendiri dan hanya membungkusnya ke dalam ThreadPoolExecutor dan itu hampir secepat grequest, tetapi tanpa ketergantungan eksternal.
sumber
mungkin permintaan-berjangka adalah pilihan lain.
Juga direkomendasikan dalam dokumen kantor . Jika Anda tidak ingin melibatkan gevent, itu bagus.
sumber
ThreadPoolExecutor(max_workers=10)
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.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.
sumber
async
. Maka misalnya Anda bisa melakukannyaawait response = requests.get(URL)
. Tidak?requests
hampir tidak lebih cepat (dan dalam beberapa kasus lebih lambat) daripada hanya memanggil daftar URL secara serempak. Misalnya, meminta titik akhir yang membutuhkan 3 detik untuk merespons 10 kali menggunakan strategi di atas membutuhkan waktu sekitar 30 detik. Jika Anda inginasync
kinerja sejati , Anda perlu menggunakan sesuatu sepertiaiohttp
.Saya tahu ini telah ditutup untuk sementara waktu, tetapi saya pikir mungkin berguna untuk mempromosikan solusi async lain yang dibangun di pustaka permintaan.
Dokumen ada di sini: http://pythonhosted.org/simple-requests/
sumber
sumber
Jika Anda ingin menggunakan asyncio, maka sediakan
requests-async
fungsionalitas async / tunggu untukrequests
- https://github.com/encode/requests-asyncsumber
Saya telah menggunakan permintaan python untuk panggilan async terhadap API intisari github untuk beberapa waktu.
Sebagai contoh, lihat kode di sini:
https://github.com/davidthewatson/flasgist/blob/master/views.py#L60-72
Gaya python ini mungkin bukan contoh yang paling jelas, tetapi saya dapat meyakinkan Anda bahwa kodenya berfungsi. Beri tahu saya jika ini membingungkan Anda dan saya akan mendokumentasikannya.
sumber
Anda bisa menggunakannya
httpx
untuk itu.jika Anda ingin sintaks fungsional, gamla lib membungkusnya
get_async
.Maka Anda bisa melakukannya
Ini
10
adalah batas waktu dalam hitungan detik.(penafian: saya penulisnya)
sumber
respx
untuk mengejek / pengujian :)Saya juga mencoba beberapa hal menggunakan metode asynchronous di python, bagaimana pun saya memiliki keberuntungan yang lebih baik menggunakan twisted untuk pemrograman asynchronous. Ini memiliki lebih sedikit masalah dan didokumentasikan dengan baik. Berikut ini adalah tautan dari sesuatu yang serupa dengan apa yang Anda coba memutar.
http://pythonquirks.blogspot.com/2011/04/twisted-asynchronous-http-request.html
sumber