Program yang membuat beberapa proses yang bekerja pada antrian yang dapat digabungkan Q
, dan pada akhirnya dapat memanipulasi kamus global D
untuk menyimpan hasil. (sehingga setiap proses anak dapat menggunakan D
untuk menyimpan hasilnya dan juga melihat hasil apa yang dihasilkan oleh proses anak lainnya)
Jika saya mencetak kamus D dalam proses anak, saya melihat modifikasi yang telah dilakukan di atasnya (yaitu di D). Tetapi setelah proses utama bergabung dengan Q, jika saya mencetak D, itu adalah dict kosong!
Saya mengerti ini adalah masalah sinkronisasi / kunci. Dapatkah seseorang memberi tahu saya apa yang terjadi di sini, dan bagaimana saya dapat menyinkronkan akses ke D?
Jawaban:
Jawaban umum melibatkan penggunaan suatu
Manager
objek. Diadaptasi dari dokumen:Keluaran:
sumber
multiprocessing.Manager()
mengembalikan sebuah instance dariSyncManager
, yang namanya menyarankan sebanyak itu!Manager
tetapi masih belum berhasil. Bisakah Anda melihat pertanyaan saya di sini dan melihat apakah Anda dapat menawarkan solusi? Saya masih bisa mendapatkan nomor acak yang berbeda jika saya melakukannyanp.random.seed(None)
setiap kali saya menghasilkan nomor acak, tetapi ini tidak memungkinkan saya untuk menggunakan keadaan acak dari proses induk, yang bukan itu yang saya inginkan. Bantuan apa pun sangat dihargai.multiprocessing tidak seperti threading. Setiap proses anak akan mendapatkan salinan memori proses utama. Umumnya keadaan dibagi melalui komunikasi (pipa / soket), sinyal, atau memori bersama.
Multiprocessing membuat beberapa abstraksi tersedia untuk kasus penggunaan Anda - status bersama yang diperlakukan sebagai lokal dengan menggunakan proxy atau memori bersama: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Bagian yang relevan:
sumber
Saya ingin membagikan pekerjaan saya sendiri yang lebih cepat daripada dikt Manajer dan lebih sederhana serta lebih stabil daripada pustaka pyshmht yang menggunakan banyak memori dan tidak berfungsi untuk Mac OS. Meskipun dict saya hanya berfungsi untuk string biasa dan saat ini tidak dapat diubah. Saya menggunakan implementasi probing linier dan menyimpan kunci dan pasangan nilai dalam blok memori terpisah setelah tabel.
Hasil kinerja laptop saya adalah:
contoh penggunaan sederhana:
sumber
Selain @ senderle di sini, beberapa mungkin juga bertanya-tanya bagaimana cara menggunakan fungsionalitas
multiprocessing.Pool
.Hal yang menyenangkan adalah bahwa ada
.Pool()
metode kemanager
instance yang meniru semua API level atas yang sudah dikenalmultiprocessing
.Keluaran:
Ini adalah contoh yang sedikit berbeda di mana setiap proses hanya mencatat ID prosesnya ke
DictProxy
objek globald
.sumber
Mungkin Anda dapat mencoba pyshmht , berbagi ekstensi tabel hash berbasis memori untuk Python.
Memperhatikan
Ini tidak sepenuhnya diuji, hanya untuk referensi Anda.
Saat ini tidak ada mekanisme kunci / sem untuk multiprosesing.
sumber