SORU
16 Aralık 2011, Cuma


Python Çoklu işlem.Uygulamak, apply_async veya göster?ne zaman kullanılır havuzu:

Pool.apply, Pool.apply_async Pool.map kullanım durumları ile açık örneklerini gördük. Esas Pool.map; ne başkalarının avantajları kullanıyorum?

CEVAP
16 Aralık 2011, Cuma


Python eski günlerde, rasgele değişkenler ile bir işlevi çağırmak için apply kullanabilirsiniz:

apply(f,args,kwargs)

apply hala Python2 var.7 olsa Python3 ve genellikle artık kullanılmaz değil. Günümüzde

f(*args,**kwargs)

tercih edilir. multiprocessing.Pool modüller benzer bir arayüz sağlamak için çalışıyor.

Pool.apply Python 14 ** işlev çağrısı ayrı bir işlem yapılmasını ve bunun dışında gibi. İşlevi kadar Pool.apply bloklar tamamlandı.

Pool.apply_async da Python gibi yerleşik arayın hemen sonuç beklemek yerine döndüren hariç apply. ApplyResult bir nesne döndürülür. get() yönteminin bir işlev çağrısının sonucu almak için arayın. İşlevi kadar get() yöntem blokları tamamlandı. Böylece, pool.apply(func, args, kwargs) pool.apply_async(func, args, kwargs).get() eşdeğerdir.

Sağlanan Pool.apply, aynı zamanda bir geri arama Pool.apply_async yöntemi aksine, işlevi tamamlandıktan denir. Bu get() aramak yerine kullanılabilir.

Ö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()

sonuç böyle getirebilecek gibi

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]

Dikkat edin, pool.map, sonuçları sırası farklı olarak hangi pool.apply_async çağrılar yapıldı sırası gelmeyebilir.


Eğer ayrı bir işlemde bir işlevi çalıştırmak, ancak geçerli işlem yapmak istiyor için ihtiyacınız varsablokbu işlev dönünceye kadar, Pool.apply kullanın. Pool.apply, Pool.map gibi tam sonuç kadar engeller döndürülür.

Eğer çalışan işlemlerin Havuzu birçok işlevi zaman uyumsuz olarak çağırır gerçekleştirmek istiyorsanız, Pool.apply_async kullanın.siparişsonuçları Pool.apply_async çağrıları sırası aynı olması garanti edilmez.

Dikkat edin de bir dizi diyebilirizfarklıPool.apply_async fonksiyonlar (tüm aramalar aynı işlevi kullanmanız gerekir).

Buna karşılık, Pool.map geçerlidir pek çok argüman için aynı işlevi. Ancak, Pool.apply_async farklı sonuçlar emri bağımsız değişkenlerin sırası gelen döndürülür.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • FF Radio

    FF Radio

    16 Mayıs 2008
  • dougownsall

    dougownsall

    7 EKİM 2007