SORU
10 Ocak 2012, Salı


Python turşu hata Çoklu işlem

Daha basit bir örnekle hata sunamayacağı için özür dilerim, ve benim kod sonrası çok karışık. Eğer İPython kabuk programı yerine normal python kaçarsam, işler çok iyi yürüyor.

Bu sorun üzerinde biraz önceki notlara baktım. Fonksiyon bir sınıf işlevi içinde tanımlanan aramak havuzu kaynaklanmıştı. Ama bu benim için geçerli değil.

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Herhangi bir yardım seviniriz.

GÜNCELLEME: ben turşu modülü en üst düzeyinde tanımlanan işlev. Bir işlev çağırır ama iç içe geçmiş bir işlev içerir. ben.iç içe geçmiş bir işlev verdiği e, f() g aramaları() h aramaları () (), ve havuz.arıyorum apply_async(f). () f, g(), h() üst düzeyde tanımlanır. Bu model ile daha basit bir örnek denedim ama işe yarıyor.

CEVAP
10 Ocak 2012, Salı


Burada list of what can be pickled. Özellikle fonksiyonları bir modül üst düzey tanımlanmış ise picklable.

Bu kod parçası:

import multiprocessing as mp

class Foo():
    @staticmethod
    def work(self):
        pass

pool = mp.Pool()
foo = Foo()
pool.apply_async(foo.work)
pool.close()
pool.join()

verimleri bir deftere bir hata hemen hemen aynı:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 315, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Sorun pool yöntemler queue.Queue Bir alt işlemler için görevleri geçmek için kullanın. queue.Queue içinden geçen her şeyi maymuncuk ile açılamaz olmalıdır, ve foo.work modül üst düzeyde tanımlı olduğundan picklable değildir.

foo.work() çağıran üst düzeyde bir fonksiyon tanımlayarak sabit olabilir:

def work(foo):
    foo.work()

pool.apply_async(work,args=(foo,))

foo Foo üst düzey foo.__dict__ tanımlandığından maymuncuk ile açılamaz, dikkat edin picklable.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AllYourNewsByMe

    AllYourNewsB

    18 Temmuz 2011
  • dcigs

    dcigs

    9 EYLÜL 2006
  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009