SORU
20 Temmuz 2010, Salı


Çoklu işlem: Havuz.bir harita işlevi bir sınıf içinde tanımlanan

ben çalıştırmak gibi bir şey

from multiprocessing import Pool
p = Pool(5)
def f(x):
     return x*x
p.map(f, [1,2,3])

gayet iyi çalışıyor. Ancak, bir sınıfın bir fonksiyonu olarak bu koyarak

class calculate(object):
 def run(self):
  def f(x):
   return x*x

  p = Pool() 
  return p.map(f, [1,2,3])

cl = calculate()
print cl.run()

bana aşağıdaki hatayı veriyor.

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

Alex Martelli bir yazı sorun aynı tür muamele gördüm, ama yeterince açık değildi.

CEVAP
17 NİSAN 2013, ÇARŞAMBA


Üç Sebep için kodları şu ana kadar yayınlanan kullanabilirim.

  1. Bu kodları kullanarak "Çoklu işlem.Havuzu" lambda ifadeleri ile çalışmaz.
  2. Kodları "Çoklu işlem.kullanmıyor Havuz iş kalemleri olarak" pek çok işlem gibi spawn.
  3. Tüm kodları fiili çalışma yapmadan önce bütün giriş listesi yineleme.

2.) performans kaygısı, 3.) http://code.google.com/p/python-progressbar/ gibi bir ilerleme çubuğu kullanımını yasaklıyor

Kodu s uyarladım.t. işçiler, önceden tanımlanmış bir miktar yumurtlar ve eğer boşta işçi varsa orada sadece giriş listesi arasında dolaşır. Ben de "daemon" işçi s modu etkin t. kontrol-c beklendiği gibi çalışır.

import multiprocessing

def fun(f,q_in,q_out):
    while True:
        i,x = q_in.get()
        if i is None:
            break
        q_out.put((i,f(x)))

def parmap(f, X, nprocs = multiprocessing.cpu_count()):
    q_in   = multiprocessing.Queue(1)
    q_out  = multiprocessing.Queue()

    proc = [multiprocessing.Process(target=fun,args=(f,q_in,q_out)) for _ in range(nprocs)]
    for p in proc:
        p.daemon = True
        p.start()

    sent = [q_in.put((i,x)) for i,x in enumerate(X)]
    [q_in.put((None,None)) for _ in range(nprocs)]
    res = [q_out.get() for _ in range(len(sent))]

    [p.join() for p in proc]

    return [x for i,x in sorted(res)]

if __name__ == '__main__':
    print(parmap(lambda i: i*2, [1,2,3,4,6,7,8]))

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • Moto Journal

    Moto Journal

    28 Mayıs 2007
  • REK Roth Productions

    REK Roth Pro

    8 Ocak 2011