Saya belum melihat contoh yang jelas dengan kasus penggunaan untuk Pool.apply , Pool.apply_async dan Pool.map . Saya terutama menggunakan Pool.map
; apa kelebihan orang lain?
sumber
Saya belum melihat contoh yang jelas dengan kasus penggunaan untuk Pool.apply , Pool.apply_async dan Pool.map . Saya terutama menggunakan Pool.map
; apa kelebihan orang lain?
Kembali ke masa lalu Python, untuk memanggil fungsi dengan argumen arbitrer, Anda akan menggunakan apply
:
apply(f,args,kwargs)
apply
masih ada di Python2.7 meskipun tidak di Python3, dan umumnya tidak digunakan lagi. Sekarang,
f(*args,**kwargs)
lebih disukai. The multiprocessing.Pool
modul mencoba untuk menyediakan antarmuka yang sama.
Pool.apply
seperti Python apply
, kecuali bahwa pemanggilan fungsi dilakukan dalam proses terpisah. Pool.apply
blok sampai fungsi selesai.
Pool.apply_async
juga seperti built-in Python apply
, kecuali bahwa panggilan kembali dengan segera alih-alih menunggu hasilnya. Sebuah AsyncResult
objek dikembalikan. Anda memanggil get()
metode untuk mengambil hasil dari panggilan fungsi. The get()
Metode blok sampai fungsi selesai. Jadi, pool.apply(func, args, kwargs)
sama dengan pool.apply_async(func, args, kwargs).get()
.
Berbeda dengan Pool.apply
, Pool.apply_async
metode ini juga memiliki panggilan balik yang, jika disediakan, dipanggil ketika fungsi selesai. Ini bisa digunakan alih-alih menelepon get()
.
Sebagai contoh:
import multiprocessing as mp
import time
def foo_pool(x):
time.sleep(2)
return x*x
result_list = []
def log_result(result):
# This is called whenever foo_pool(i) returns a result.
# result_list is modified only by the main process, not the pool workers.
result_list.append(result)
def apply_async_with_callback():
pool = mp.Pool()
for i in range(10):
pool.apply_async(foo_pool, args = (i, ), callback = log_result)
pool.close()
pool.join()
print(result_list)
if __name__ == '__main__':
apply_async_with_callback()
dapat menghasilkan hasil seperti
[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
Perhatikan, tidak seperti pool.map
, urutan hasil mungkin tidak sesuai dengan urutan di mana pool.apply_async
panggilan dilakukan.
Jadi, jika Anda perlu menjalankan fungsi dalam proses terpisah, tetapi ingin proses saat ini untuk memblokir sampai fungsi itu kembali, gunakan Pool.apply
. Seperti Pool.apply
, Pool.map
memblokir sampai hasil lengkap dikembalikan.
Jika Anda ingin Kelompok pekerja proses melakukan banyak panggilan fungsi secara tidak sinkron, gunakan Pool.apply_async
. The agar hasil tidak dijamin sama dengan urutan panggilan ke Pool.apply_async
.
Perhatikan juga bahwa Anda dapat memanggil sejumlah fungsi berbedaPool.apply_async
(tidak semua panggilan perlu menggunakan fungsi yang sama).
Sebaliknya, Pool.map
berlaku fungsi yang sama untuk banyak argumen. Namun, tidak seperti Pool.apply_async
, hasilnya dikembalikan dalam urutan yang sesuai dengan urutan argumen.
if __name__=="__main__"
sebelumnyaapply_async_with_callback()
di Windows?Pool.map(func,iterable)
itu setara denganPool.map_async(func,iterable).get()
. Jadi hubungan antaraPool.map
danPool.map_async
mirip denganPool.apply
danPool.apply_async
. Theasync
perintah kembali segera, sedangkan nonasync
perintah memblokir. Theasync
perintah juga memiliki callback.Pool.map
danPool.apply
mirip dengan memutuskan kapan akan menggunakanmap
atauapply
dengan Python. Anda cukup menggunakan alat yang sesuai dengan pekerjaan. Memutuskan antara menggunakanasync
dan bukanasync
versi tergantung pada apakah Anda ingin panggilan untuk memblokir proses saat ini dan / atau jika Anda ingin menggunakan panggilan balik.apply_async
mengembalikanApplyResult
objek. Menyebut bahwaApplyResult
'sget
metode akan mengembalikan nilai kembali fungsi terkait (atau kenaikan gajimp.TimeoutError
jika kali-out. Panggilan) Jadi, jika Anda menempatkanApplyResult
dalam daftar memerintahkan, kemudian memanggil merekaget
metode akan mengembalikan hasil dalam urutan yang sama. Anda bisa menggunakannyapool.map
dalam situasi ini.Tentang
apply
vsmap
:pool.apply(f, args)
:f
hanya dieksekusi di SALAH SATU pekerja kolam. Jadi SALAH SATU proses di kolam akan berjalanf(args)
.pool.map(f, iterable)
: Metode ini memotong iterable ke dalam sejumlah chunk yang dikirimkan ke kumpulan proses sebagai tugas yang terpisah. Jadi, Anda memanfaatkan semua proses di kolam renang.sumber
apply_async()
8 kali? Apakah akan secara otomatis menanganinya dengan antrian?Berikut ini adalah ikhtisar dalam format tabel untuk menunjukkan perbedaan antara
Pool.apply
,Pool.apply_async
,Pool.map
danPool.map_async
. Saat memilih satu, Anda harus mempertimbangkan multi-argumen, konkurensi, pemblokiran, dan pemesanan:Catatan:
Pool.imap
danPool.imap_async
- versi peta dan map_async yang lebih malas.Pool.starmap
Metode, sangat mirip dengan metode peta selain itu menerima beberapa argumen.Async
metode mengirimkan semua proses sekaligus dan mengambil hasilnya setelah selesai. Gunakan metode get untuk mendapatkan hasil.Pool.map
(atauPool.apply
) metode sangat mirip dengan peta bawaan Python (atau terapkan). Mereka memblokir proses utama sampai semua proses selesai dan mengembalikan hasilnya.Contoh:
peta
Disebut untuk daftar pekerjaan dalam satu waktu
menerapkan
Hanya bisa dipanggil untuk satu pekerjaan
map_async
Disebut untuk daftar pekerjaan dalam satu waktu
apply_async
Hanya dapat dipanggil untuk satu pekerjaan dan mengeksekusi pekerjaan di latar belakang secara paralel
starmap
Merupakan varian
pool.map
yang mendukung banyak argumenstarmap_async
Kombinasi starmap () dan map_async () yang beriterasi iterable dari iterables dan memanggil func dengan iterables dibongkar. Mengembalikan objek hasil.
Referensi:
Temukan dokumentasi lengkap di sini: https://docs.python.org/3/library/multiprocessing.html
sumber