Lebih
Cara menggunakan threading di Python?
Saya mencoba untuk memahami threading di Python. I've melihat dokumentasi dan contoh-contoh, tetapi terus terang saja, banyak contoh-contoh yang terlalu canggih dan I'm mengalami kesulitan memahami mereka.
Bagaimana anda menunjukkan dengan jelas tugas-tugas yang dibagi untuk multi-threading?
1204
19
Karena pertanyaan ini diajukan pada tahun 2010, telah ada penyederhanaan nyata dalam cara yang sangat sederhana multithreading dengan python dengan peta dan renang.
Kode di bawah ini berasal dari sebuah artikel/posting blog yang anda pasti harus check out (afiliasi) - Paralelisme dalam satu baris: Model yang lebih Baik untuk hari ke Hari Threading Tugas. I'll meringkas di bawah ini - itu akhirnya menjadi hanya beberapa baris kode:
Yang multithreaded versi:
Deskripsi
Pelaksanaan
multiprocessing.dummy
adalah persis sama seperti multiprocessing modul, tetapi menggunakan benang bukan (perbedaan penting - menggunakan beberapa proses untuk CPU-intensif tugas; benang untuk (dan selama) IO):Dan waktu hasil:
Lewat beberapa argumen (karya-karya seperti ini hanya di Python 3.3 dan kemudian):
Untuk melewati beberapa array:
atau untuk lulus konstan dan array:
Jika anda menggunakan versi sebelumnya dari Python, anda dapat melewati beberapa argumen melalui pemecahan masalah ini.
(Terima kasih kepada user136036 untuk membantu komentar)
Berikut ini's contoh sederhana: anda perlu mencoba beberapa alternatif Url dan kembali isi pertama untuk merespon.
Ini adalah kasus di mana threading digunakan sebagai optimasi sederhana: masing-masing subthread menunggu URL untuk mengatasi dan merespon, dalam rangka untuk menempatkan isinya pada antrian; setiap thread adalah sebuah daemon (won't menjaga proses sampai jika thread utama berakhir -- yang's lebih umum daripada tidak); thread utama dimulai subthreads, tidak
mendapatkan
pada antrian untuk menunggu sampai salah satu dari mereka telah melakukanmenempatkan
, kemudian memancarkan hasil dan berakhir (yang jatuh setiap subthreads yang mungkin masih bisa berjalan, karena mereka're daemon benang).Penggunaan yang tepat dari benang dalam Python adalah selalu terhubung untuk operasi I/O (sejak CPython doesn't menggunakan beberapa core untuk menjalankan CPU-bound tugas-tugas pokoknya, satu-satunya alasan untuk threading tidak menghalangi proses sementara ada's menunggu untuk beberapa I/O). Antrian hampir selalu cara terbaik untuk pertanian bekerja untuk benang dan/atau mengumpulkan pekerjaan's hasil, by the way, dan mereka're intrinsik threadsafe sehingga mereka menyimpan anda dari khawatir tentang kunci, kondisi, peristiwa, semaphore, dan lain inter-thread koordinasi/komunikasi konsep.
CATATAN: sebenarnya paralelisasi dalam Python, anda harus menggunakan multiprocessing modul untuk membayar beberapa proses yang mengeksekusi secara paralel (karena global juru kunci, Python benang menyediakan interleaving tetapi pada kenyataannya dieksekusi secara bergantian, tidak secara paralel, dan hanya berguna ketika interleaving operasi I/O).
Namun, jika anda hanya mencari interleaving (atau melakukan operasi I/O yang dapat diparalelkan meskipun dunia juru kunci), maka threading modul adalah tempat untuk memulai. Sebagai contoh yang sangat sederhana, let's mempertimbangkan masalah menjumlahkan range yang besar dengan menjumlahkan subranges secara paralel:
Perhatikan bahwa di atas adalah sangat bodoh seperti itu tidak benar-benar tidak ada I/O dan akan dilaksanakan secara bergantian meskipun interleaved (dengan menambahkan overhead of context switching) di CPython karena global juru kunci.
Seperti yang lain disebutkan, CPython dapat menggunakan benang hanya untuk saya\O menunggu karena GIL. Jika anda ingin mendapatkan keuntungan dari beberapa core CPU-bound tugas-tugas, menggunakan multiprocessing:
Sekedar catatan, Antrian tidak diperlukan untuk threading.
Ini adalah contoh paling sederhana yang saya bisa membayangkan bahwa menunjukkan 10 proses yang berjalan secara bersamaan.
Jawaban dari Alex Martelli membantu saya, namun di sini adalah versi modifikasi yang saya pikir itu lebih berguna (setidaknya untuk saya).
Diperbarui: bekerja di kedua python2 dan python3
Saya menemukan ini sangat berguna: membuat sebagai banyak benang sebagai core dan membiarkan mereka melaksanakan (besar) jumlah dari tugas-tugas (dalam hal ini, memanggil sebuah program shell):
Diberikan sebuah fungsi,
f
, thread seperti ini:Untuk melewati argumen untuk
f
Python 3 memiliki fasilitas Launching tugas-tugas paralel. Hal ini membuat pekerjaan kami lebih mudah.
Itu untuk thread pooling dan Proses pooling.
Berikut memberikan wawasan:
ThreadPoolExecutor Contoh
ProcessPoolExecutor
Bagi saya, contoh yang sempurna untuk Threading adalah pemantauan peristiwa Asinkron. Terlihat pada kode ini.
Anda dapat bermain dengan kode ini dengan membuka IPython sesi dan melakukan sesuatu seperti:
Tunggu beberapa menit
Menggunakan baru menyala bersamaan.kontrak modul
Pelaksana pendekatan mungkin tampak akrab bagi semua orang yang mendapatkan tangan mereka kotor dengan Java sebelumnya.
Juga di samping catatan: Untuk menjaga alam semesta waras, don't lupa untuk menutup kolam renang/pelaksana jika anda don't menggunakan
dengan
konteks (yang begitu mengagumkan bahwa ia melakukannya untuk anda)Paling dokumentasi dan tutorial menggunakan Python's
Threading
danAntrian
modul mereka bisa tampak luar biasa untuk pemula.Mungkin mempertimbangkan
bersamaan.berjangka.ThreadPoolExecutor
modul python 3. Dikombinasikan dengandengan
klausul dan daftar pemahaman itu bisa menjadi nyata pesona.Saya melihat banyak contoh di sini di mana tidak ada kerja nyata sedang dilakukan + mereka sebagian besar CPU bound. Berikut adalah contoh sebuah CPU terikat tugas yang menghitung semua bilangan prima antara 10 juta dan 10,05 juta. Saya telah menggunakan semua 4 metode berikut
Berikut ini adalah hasil on my Mac OSX 4 inti mesin
Berikut ini adalah contoh yang sangat sederhana dari impor CSV menggunakan threading. [Perpustakaan inklusi mungkin berbeda untuk tujuan yang berbeda ]
Fungsi Pembantu:
Driver Fungsi:
Multi-threading dengan contoh sederhana yang akan membantu. Anda dapat menjalankan dan memahami dengan mudah bagaimana multi thread yang bekerja di python. Aku kunci yang digunakan untuk mencegah akses thread lain sampai sebelumnya benang selesai pekerjaan mereka. Dengan menggunakan
baris kode ini anda dapat memungkinkan jumlah proses pada suatu waktu dan tetap memegang untuk sisa benang yang akan berjalan nanti atau setelah selesai proses-proses yang terdahulu.
Tidak ada solusi di atas benar-benar menggunakan beberapa core pada GNU/Linux server (di mana saya don't memiliki hak admin). Mereka hanya berlari pada satu inti. Aku digunakan tingkat yang lebih rendah
os.garpu
antarmuka untuk menelurkan beberapa proses. Ini adalah kode yang bekerja untuk saya:Saya ingin berkontribusi dengan contoh sederhana dan penjelasan-penjelasan saya've ditemukan berguna ketika saya harus mengatasi masalah ini sendiri.
Dalam jawaban ini anda akan menemukan beberapa informasi tentang Python's GIL (Global Juru Kunci) dan sederhana sehari-hari contoh yang ditulis menggunakan multiprocessing.dummy ditambah beberapa tolok ukur sederhana.
Global Juru Kunci (GIL)
Python doesn't memungkinkan multi-threading dalam arti sebenarnya dari kata itu. Memiliki multi-threading paket tetapi jika anda ingin untuk multi-thread untuk kecepatan kode anda, maka itu's biasanya bukan ide yang baik untuk menggunakannya. Python memiliki konstruk yang disebut Global Juru Kunci (GIL). GIL memastikan bahwa hanya salah satu dari anda 'benang' dapat dieksekusi pada satu waktu. Thread memperoleh GIL, tidak sedikit bekerja, kemudian melewati GIL ke thread berikutnya. Ini terjadi sangat cepat sehingga mata manusia mungkin tampak seperti benang mengeksekusi secara paralel, tapi mereka benar-benar hanya bergiliran menggunakan CPU core. Semua ini GIL lewat menambahkan overhead untuk eksekusi. Ini berarti bahwa jika anda ingin membuat kode anda berjalan lebih cepat kemudian menggunakan threading paket sering isn't ide yang baik.
Ada alasan untuk menggunakan Python's threading paket. Jika anda ingin menjalankan beberapa hal secara bersamaan, dan efisiensi yang tidak perhatian, maka itu's benar-benar baik dan nyaman. Atau jika anda menjalankan kode yang diperlukan untuk menunggu sesuatu (seperti beberapa IO) maka itu bisa membuat banyak akal. Tapi threading perpustakaan won't membiarkan anda menggunakan ekstra core CPU.
Multi-threading dapat di-outsource untuk sistem operasi (dengan melakukan multi-processing), beberapa aplikasi eksternal yang memanggil anda kode Python (misalnya, Percikan atau Hadoop), atau beberapa kode yang anda Python kode panggilan (misalnya: anda bisa memiliki anda Python code memanggil fungsi C yang tidak mahal multi-threaded barang-barang).
Mengapa Hal Ini Penting
Karena banyak orang-orang menghabiskan banyak waktu mencoba untuk menemukan kemacetan di mewah mereka Python multi-threaded kode sebelum mereka belajar apa GIL.
Setelah informasi ini jelas di sini's my kode:
Dengan pinjaman dari post ini kita tahu tentang memilih antara multithreading, multiprocessing, dan async dan penggunaan mereka.
Python3 memiliki built-in perpustakaan dalam rangka untuk concurrency dan paralelisme: bersamaan.kontrak
Jadi saya menunjukkan dengan percobaan untuk menjalankan empat tugas (yaitu
.tidur()
metode) olehThreading-Renang
dengan cara:Keluar:
[CATATAN]:
3
pekerja untuk empat tugas.thread
) anda bisa mengubahThreadPoolExecutor
denganProcessPoolExecutor