Di pustaka multiprosesor Python, apakah ada varian pool.map yang mendukung banyak argumen?
text = "test"
def harvester(text, case):
X = case[0]
text+ str(X)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=6)
case = RAW_DATASET
pool.map(harvester(text,case),case, 1)
pool.close()
pool.join()
python
multiprocessing
pengguna642897
sumber
sumber
partial
ataulambda
melakukan ini. Saya pikir itu ada hubungannya dengan cara aneh bahwa fungsi dilewatkan ke subproses (viapickle
).pool.map(harvester(text,case),case, 1)
dengan:pool.apply_async(harvester(text,case),case, 1)
return
untukharvester()
respon @senderie 's berubah menjadi tidak akurat. Itu tidak membantu pembaca di masa depan.Jawaban:
Jawabannya bergantung pada versi dan situasi. Jawaban paling umum untuk versi terbaru Python (sejak 3.3) pertama kali dijelaskan di bawah ini oleh JF Sebastian . 1 Menggunakan
Pool.starmap
metode, yang menerima urutan argumen tuple. Itu kemudian secara otomatis membongkar argumen dari setiap tuple dan meneruskannya ke fungsi yang diberikan:Untuk versi Python sebelumnya, Anda harus menulis fungsi pembantu untuk membongkar argumen secara eksplisit. Jika Anda ingin menggunakan
with
, Anda juga harus menulis pembungkus untuk berubahPool
menjadi manajer konteks. (Terima kasih kepada muon untuk menunjukkan ini.)Dalam kasus yang lebih sederhana, dengan argumen kedua tetap, Anda juga bisa menggunakan
partial
, tetapi hanya dengan Python 2.7+.1. Banyak dari ini terinspirasi oleh jawabannya, yang seharusnya diterima sebagai gantinya. Tapi karena yang satu ini macet di puncak, sepertinya lebih baik untuk memperbaikinya bagi pembaca masa depan.
sumber
=RAW_DATASET
nilai defaultcase
. Kalau tidak,pool.map
akan membingungkan tentang beberapa argumen.text
variabel dalam contoh Anda? KenapaRAW_DATASET
sepertinya dilewati dua kali. Saya pikir Anda mungkin memiliki kesalahan ketik?with .. as ..
memberi sayaAttributeError: __exit__
, tetapi berfungsi dengan baik jika saya panggilpool = Pool();
lalu tutup secara manualpool.close()
(python2.7)Pool
objek tidak menjadi manajer konteks sampai Python 3.3. Saya telah menambahkan fungsi pembungkus sederhana yang mengembalikanPool
manajer konteks.Python 3.3 termasuk
pool.starmap()
metode :Untuk versi yang lebih lama:
Keluaran
Perhatikan bagaimana
itertools.izip()
danitertools.repeat()
digunakan di sini.Karena bug yang disebutkan oleh @unutbu Anda tidak dapat menggunakan
functools.partial()
atau kemampuan serupa pada Python 2.6, sehingga fungsi pembungkus sederhanafunc_star()
harus didefinisikan secara eksplisit. Lihat juga solusi yang disarankan olehuptimebox
.sumber
func_star
seperti ini:def func_star((a, b))
. Tentu saja, ini hanya berfungsi untuk sejumlah argumen, tetapi jika itu adalah satu-satunya kasus yang ia miliki, itu lebih mudah dibaca.f((a,b))
sintaks sudah usang dan dihapus di py3k. Dan itu tidak perlu di sini.func = lambda x: func(*x)
alih-alih mendefinisikan fungsi wrapperfunc_star()
atas)starstarmap
.Saya pikir di bawah ini akan lebih baik
keluaran
sumber
args
langsungadd
, itu berfungsi untuk sejumlah argumen:def add(args): (x,y) = args
lambda
fungsi alih-alih mendefinisikanmulti_run_wrapper(..)
lambda
tidak berfungsi karenapool.map(..)
mencoba untuk mengambil fungsi yang diberikanadd
dalam daftar?Menggunakan Python 3.3+ dengan
pool.starmap():
Hasil:
Anda juga dapat memberi zip () lebih banyak argumen jika suka:
zip(a,b,c,d,e)
Jika Anda ingin memiliki nilai konstan yang diteruskan sebagai argumen yang harus Anda gunakan
import itertools
dan kemudianzip(itertools.repeat(constant), a)
misalnya.sumber
Setelah mengetahui tentang itertools di JF Sebastian, saya memutuskan untuk mengambil langkah lebih jauh dan menulis
parmap
paket yang memperhatikan paralelisasi, penawaranmap
danstarmap
fungsi pada python-2.7 dan python-3.2 (dan kemudian juga) yang dapat mengambil sejumlah argumen posisi .Instalasi
Cara memparalelkan:
Saya telah mengunggah parmap ke PyPI dan ke repositori github .
Sebagai contoh, pertanyaannya bisa dijawab sebagai berikut:
sumber
# "Cara mengambil banyak argumen".
sumber
Ada garpu yang
multiprocessing
disebut patho ( catatan: gunakan versi di github ) yang tidak perlustarmap
- fungsi peta mencerminkan API untuk peta python, sehingga peta dapat mengambil beberapa argumen. Denganpathos
, Anda juga dapat secara umum melakukan multiprocessing dalam interpreter, alih-alih terjebak di__main__
blok. Pathos akan dirilis, setelah beberapa pembaruan ringan - kebanyakan konversi ke python 3.x.pathos
memiliki beberapa cara yang dapat Anda lakukan untuk mendapatkan perilaku yang tepatstarmap
.sumber
Anda dapat menggunakan dua fungsi berikut untuk menghindari penulisan pembungkus untuk setiap fungsi baru:
Gunakan fungsi
function
dengan daftar argumenarg_0
,arg_1
danarg_2
sebagai berikut:sumber
Solusi yang lebih baik untuk python2:
2 3 4
1 2 3
0 1 2
di luar[]:
[3, 5, 7]
sumber
Alternatif sederhana lainnya adalah membungkus parameter fungsi Anda dalam tuple dan kemudian membungkus parameter yang harus dilewatkan dalam tupel juga. Ini mungkin tidak ideal ketika berhadapan dengan banyak data. Saya percaya itu akan membuat salinan untuk setiap tuple.
Memberikan output dalam urutan acak:
sumber
Cara yang lebih baik adalah menggunakan dekorator alih-alih menulis fungsi pembungkus dengan tangan. Terutama ketika Anda memiliki banyak fungsi untuk dipetakan, dekorator akan menghemat waktu Anda dengan menghindari pembungkus tulisan untuk setiap fungsi. Biasanya fungsi yang didekorasi tidak dapat dipilih, namun kita dapat menggunakannya
functools
untuk menyiasatinya. Lebih banyak diskusi dapat ditemukan di sini .Berikut contohnya
Kemudian Anda dapat memetakannya dengan argumen zip
Tentu saja, Anda selalu dapat menggunakan
Pool.starmap
dalam Python 3 (> = 3.3) sebagaimana disebutkan dalam jawaban lain.sumber
itertools.product
sebagai gantinyazip
.Cara lain adalah dengan menyerahkan daftar daftar ke rutinitas satu argumen:
Dari satu dapat membangun daftar daftar argumen dengan metode favorit seseorang.
sumber
Berikut adalah cara lain untuk melakukannya bahwa IMHO lebih sederhana dan elegan daripada jawaban lain yang disediakan.
Program ini memiliki fungsi yang mengambil dua parameter, mencetaknya dan juga mencetak jumlah:
output adalah:
Lihat dokumen python untuk info lebih lanjut:
https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool
Khususnya pastikan untuk memeriksa
starmap
fungsi.Saya menggunakan Python 3.6, saya tidak yakin apakah ini akan berfungsi dengan versi Python yang lebih lama
Mengapa tidak ada contoh yang sangat mudah seperti ini di dokumen, saya tidak yakin.
sumber
Dari python 3.4.4, Anda dapat menggunakan multiprocessing.get_context () untuk mendapatkan objek konteks untuk menggunakan beberapa metode mulai:
Atau Anda cukup mengganti saja
oleh:
sumber
Ada banyak jawaban di sini, tetapi tampaknya tidak ada yang memberikan kode yang kompatibel dengan Python 2/3 yang akan berfungsi pada versi apa pun. Jika Anda ingin kode Anda hanya berfungsi , ini akan berfungsi untuk versi Python:
Setelah itu, Anda bisa menggunakan multiprosesing dengan cara Python 3 biasa, sesuka Anda. Sebagai contoh:
akan bekerja di Python 2 atau Python 3.
sumber
Dalam dokumentasi resmi disebutkan bahwa itu hanya mendukung satu argumen yang dapat diubah. Saya suka menggunakan apply_async dalam kasus seperti itu. Dalam kasus Anda, saya akan melakukan:
sumber
sumber
Ini adalah contoh rutin yang saya gunakan untuk meneruskan beberapa argumen ke fungsi satu argumen yang digunakan dalam fork pool.imap :
sumber
untuk python2, Anda dapat menggunakan trik ini
sumber