Saya menemukan bahwa di Python 3.4 ada beberapa perpustakaan yang berbeda untuk multiprocessing / threading: multiprocessing vs threading vs asyncio .
Tapi saya tidak tahu mana yang akan digunakan atau yang "direkomendasikan". Apakah mereka melakukan hal yang sama atau berbeda? Jika iya, mana yang digunakan untuk apa? Saya ingin menulis program yang menggunakan multicores di komputer saya. Tapi saya tidak tahu perpustakaan mana yang harus saya pelajari.
python
multithreading
python-3.x
multiprocessing
python-asyncio
user3654650
sumber
sumber
Jawaban:
Mereka ditujukan untuk tujuan dan / atau persyaratan yang (sedikit) berbeda. CPython (tipikal, implementasi Python jalur utama) masih memiliki kunci interpreter global sehingga aplikasi multi-threaded (cara standar untuk mengimplementasikan pemrosesan paralel saat ini) menjadi suboptimal. Itulah mengapa
multiprocessing
mungkin lebih disukaithreading
. Tetapi tidak setiap masalah dapat secara efektif dipecah menjadi bagian-bagian [hampir independen], jadi mungkin ada kebutuhan dalam komunikasi antarproses yang berat. Itu sebabnyamultiprocessing
mungkin tidak disukai daripadathreading
secara umum.asyncio
(teknik ini tersedia tidak hanya di Python, bahasa dan / atau kerangka kerja lain juga memilikinya, misalnya Boost.ASIO ) adalah metode untuk secara efektif menangani banyak operasi I / O dari banyak sumber secara bersamaan tanpa perlu eksekusi kode paralel . Jadi ini hanya solusi (yang memang bagus!) Untuk tugas tertentu, bukan untuk pemrosesan paralel pada umumnya.sumber
[Jawaban cepat]
TL; DR
Membuat Pilihan yang Tepat:
Referensi
[ CATATAN ]:
asyncio
event loop yang sangat cepat ( uvloop membuatasyncio
2-4x lebih cepat).[PEMBARUAN (2019)]:
sumber
asyncio
saat Anda menggunakan dari fungsi yang menunggu,request
perpustakaan bukanlah metode yang dapat menunggu, alih-alih Anda dapat menggunakan sepertiaiohttp
perpustakaan atau async-request dan lainIni adalah ide dasarnya:
Jadi pada dasarnya tetap berpegang pada threading kecuali Anda memiliki masalah IO / CPU.
sumber
Dalam multiprosesing Anda memanfaatkan banyak CPU untuk mendistribusikan perhitungan Anda. Karena masing-masing CPU berjalan secara paralel, Anda secara efektif dapat menjalankan banyak tugas secara bersamaan. Anda ingin menggunakan multiprocessing untuk CPU-terikat tugas tugas yang . Contohnya adalah mencoba menghitung jumlah semua elemen dari daftar besar. Jika mesin Anda memiliki 8 inti, Anda dapat "memotong" daftar menjadi 8 daftar yang lebih kecil dan menghitung jumlah masing-masing daftar tersebut secara terpisah pada inti terpisah dan kemudian menjumlahkan angka-angka itu. Anda akan mendapatkan kecepatan ~ 8x dengan melakukan itu.
Dalam - penggunaan threading. threadingAnda tidak membutuhkan banyak CPU. Bayangkan sebuah program yang mengirimkan banyak permintaan HTTP ke web. Jika Anda menggunakan program single-threaded, itu akan menghentikan eksekusi (blok) di setiap permintaan, menunggu respons, dan kemudian melanjutkan setelah menerima respons. Masalahnya di sini adalah bahwa CPU Anda tidak benar-benar berfungsi sambil menunggu server eksternal melakukan pekerjaan itu; itu sebenarnya bisa melakukan beberapa pekerjaan berguna untuk sementara waktu! Cara mengatasinya adalah dengan menggunakan utas - Anda dapat membuat banyak utas, masing-masing bertanggung jawab untuk meminta beberapa konten dari web. Hal yang menyenangkan tentang utas adalah, meskipun mereka berjalan pada satu CPU, CPU dari waktu ke waktu "membekukan" eksekusi satu utas dan melompat untuk mengeksekusi utas lainnya (ini disebut pengalihan konteks dan itu terjadi terus-menerus pada non-deterministik interval).
asyncio pada dasarnya adalah threading di mana bukan CPU tetapi Anda, sebagai programmer (atau sebenarnya aplikasi Anda), memutuskan di mana dan kapan peralihan konteks terjadi . Di Python, Anda menggunakan
await
kata kunci untuk menangguhkan eksekusi coroutine Anda (ditentukan menggunakanasync
kata kunci).sumber