Pool.apply , Pool.apply_async ve Pool.map için use-durumlarda açık örnekler görmedim . Ben esas olarak kullanıyorum Pool.map
; başkalarının avantajları nelerdir?
Pool.apply , Pool.apply_async ve Pool.map için use-durumlarda açık örnekler görmedim . Ben esas olarak kullanıyorum Pool.map
; başkalarının avantajları nelerdir?
Yanıtlar:
Python'un eski günlerinde, rastgele bağımsız değişkenlere sahip bir işlevi çağırmak için şunları kullanırsınız apply
:
apply(f,args,kwargs)
apply
hala Python3'te olmasa da Python2.7'de bulunmaktadır ve genellikle artık kullanılmamaktadır. Şu günlerde,
f(*args,**kwargs)
tercih edilir. multiprocessing.Pool
Modüller benzer bir arayüz sağlamaya çalışır.
Pool.apply
apply
işlev çağrısının ayrı bir işlemde gerçekleştirilmesi dışında Python gibidir . Pool.apply
fonksiyon tamamlanana kadar engeller.
Pool.apply_async
Python'un yerleşik olduğu gibi apply
, ancak arama sonucu sonucu beklemek yerine hemen geri döner. Bir AsyncResult
nesne döndürülür. Bunu diyoruz get()
işlev çağrısının sonucunu almak için yöntem. get()
İşlev kadar yöntemi engeller tamamlanır. Böylece, pool.apply(func, args, kwargs)
eşdeğerdir pool.apply_async(func, args, kwargs).get()
.
Bunun aksine Pool.apply
, Pool.apply_async
yöntemin, ayrıca, işlev tamamlandığında çağrıldığında çağrılan bir geri çağrısı vardır. Bu, arama yapmak yerine kullanılabilir get()
.
Örneğin:
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()
gibi bir sonuç verebilir
[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
Dikkat edin, pool.map
sonuçların sırası, pool.apply_async
aramaların yapıldığı sıraya uygun olmayabilir .
Dolayısıyla, bir işlevi ayrı bir işlemde çalıştırmanız gerekiyorsa, ancak geçerli işlemin bu işlev dönene kadar engellenmesini istiyorsanız , kullanın Pool.apply
. Gibi Pool.apply
, Pool.map
tam sonuç dönene kadar engeller.
İşçi Havuzu işlemlerinin birçok işlev çağrısını eşzamansız olarak gerçekleştirmesini istiyorsanız kullanın Pool.apply_async
. Sipariş sonuçlarının çağrıları için aynı olması garanti edilmez Pool.apply_async
.
Ayrıca, bir dizi farklı işlevi çağırabileceğinize dikkat edin Pool.apply_async
(tüm aramaların aynı işlevi kullanması gerekmez).
Aksine, Pool.map
aynı işlevi birçok argümana uygular. Bununla birlikte, Pool.apply_async
sonuçlar, argümanların sırasına karşılık gelen bir sırayla döndürülür.
Pool.map(func,iterable)
bunun eşdeğer olduğunu göreceksiniz Pool.map_async(func,iterable).get()
. Arasındaki ilişki Yani Pool.map
ve Pool.map_async
benzer olduğunu Pool.apply
ve Pool.apply_async
. async
Olmayan ederken komutlar, derhal geri async
komutları engeller. async
Komutlar da bir geri arama var.
Pool.map
ve Pool.apply
kullanmak, karar vermek benzer map
veya apply
Python. Sadece işe uyan aracı kullanın. Kullanmak arasındaki karar vermek async
ve sivil async
versiyonunu Çağrı akım sürecini engellemek istiyorsanız bağlıdır ve / veya geri arama kullanmak istiyorsanız.
apply_async
bir ApplyResult
nesne döndürür . Bu çağrı ApplyResult
bireyin get
(veya zam yöntemi ilişkili işlevin dönüş değeri döndürecektir mp.TimeoutError
çağrı süreleri aşımı.) Böylece eğer koymak ApplyResult
daha sonra arayarak, sıralı bir listedeki s get
aynı sırayla sonuçları döndürür yöntemleri. pool.map
Ancak bu durumda kullanabilirsiniz .
apply
Vs ile ilgili map
:
pool.apply(f, args)
: f
havuzun sadece bir tanesinde idam edilir. Böylece havuzdaki süreçlerden BİRİ çalışır f(args)
.
pool.map(f, iterable)
: Bu yöntem, yinelenebilir işlem havuzuna ayrı görevler olarak gönderdiği bir dizi parçaya ayırır. Böylece havuzdaki tüm işlemlerden faydalanırsınız.
apply_async()
8 kez aradığımda ne olur ? Otomatik olarak bir kuyrukla başa çıkacak mı?
İşte arasındaki farkları göstermek için bir tablo biçiminde bir bakış Pool.apply
, Pool.apply_async
, Pool.map
ve Pool.map_async
. Birini seçerken, çoklu argümanları, eşzamanlılığı, engellemeyi ve siparişi dikkate almanız gerekir:
| Multi-args Concurrence Blocking Ordered-results
---------------------------------------------------------------------
Pool.map | no yes yes yes
Pool.map_async | no yes no yes
Pool.apply | yes no yes no
Pool.apply_async | yes yes no no
Pool.starmap | yes yes yes yes
Pool.starmap_async| yes yes no no
Pool.imap
ve Pool.imap_async
- map ve map_async'in daha tembel versiyonu.
Pool.starmap
yöntemi, çok sayıda argümanın kabulünün yanı sıra harita yöntemine çok benzer.
Async
yöntemleri tüm işlemleri bir kerede gönderir ve bittikten sonra sonuçları alır. Sonuçları elde etmek için get yöntemini kullanın.
Pool.map
(veya Pool.apply
) yöntemler Python yerleşik haritasına çok benzer (veya uygulayın). Tüm süreçler tamamlanana ve sonucu döndürene kadar ana süreci engellerler.
Bir seferde işlerin listesi için çağrılır
results = pool.map(func, [1, 2, 3])
Sadece bir iş için çağrılabilir
for x, y in [[1, 1], [2, 2]]:
results.append(pool.apply(func, (x, y)))
def collect_result(result):
results.append(result)
Bir seferde işlerin listesi için çağrılır
pool.map_async(func, jobs, callback=collect_result)
Yalnızca bir iş için çağrılabilir ve arka planda bir işi paralel olarak yürütür
for x, y in [[1, 1], [2, 2]]:
pool.apply_async(worker, (x, y), callback=collect_result)
pool.map
Birden fazla argümanı destekleyen bir varyantıdır
pool.starmap(func, [(1, 1), (2, 1), (3, 1)])
Yinelenebilir yinelemelerin üzerinden yinelenen ve paketten çıkarılan yinelenebilirler ile çağrı yapan bir starmap () ve map_async () birleşimi. Bir sonuç nesnesi döndürür.
pool.starmap_async(calculate_worker, [(1, 1), (2, 1), (3, 1)], callback=collect_result)
Belgelerin tamamını burada bulabilirsiniz: https://docs.python.org/3/library/multiprocessing.html
if __name__=="__main__"
önce olmalı mıapply_async_with_callback()
?