2010-05-06 23 views
53

Bunun daha önce yanıtlandığını biliyorum, ancak betiği doğrudan "python filename.py" çalıştırmanın çalışmadığı görülüyor. SuSE Linux'ta Python 2.6.2 var.çoklu işlem hatası ile başka bir karışıklık, 'module' nesnesi 'f' özniteliğine sahip değil 'f'

Kodu:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
p = Pool(1) 
def f(x): 
    return x*x 
p.map(f, [1, 2, 3]) 

Komut satırı:

> python example.py 
Process PoolWorker-1: 
Traceback (most recent call last): 
File "/usr/lib/python2.6/multiprocessing/process.py", line 231, in _bootstrap 
    self.run() 
File "/usr/lib/python2.6/multiprocessing/process.py", line 88, in run 
    self._target(*self._args, **self._kwargs) 
File "/usr/lib/python2.6/multiprocessing/pool.py", line 57, in worker 
    task = get() 
File "/usr/lib/python2.6/multiprocessing/queues.py", line 339, in get 
    return recv() 
AttributeError: 'module' object has no attribute 'f' 
+1

[terminalde ve Django veya Flask için kod moudles içinde Pool çoklu işlem python kullanarak] olası yinelenen (http://stackoverflow.com/questions/18947876/using-python-multiprocessing-pool açıklanmıştır -in-terminal-ve-in-kod-moudles-django için) –

+0

(. Bu gönderi, bundan daha geç, bu 2010, bir tane 2013 – gatoatigrado

+2

Yaş irrevelant, daha iyi bir cevapla sorulan meta hakkında fikir birliği olmalı ve bir diğerinin IMO'nun daha iyi bir cevabı var. –

cevap

98

Kodunuzu, Havuz örneğini oluşturmadan önce f() işlevinin tanımlanması için yeniden yapılandırın. Aksi halde çalışan görevinizi göremez.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from multiprocessing import Pool 

def f(x): 
    return x*x 

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

harika, çok teşekkür ederim! Ne şifreli kullanım! – gatoatigrado

+1

NOT: Birkaç yıl sonra, bu hatayı daha zor hale getiren bir imap alternatifi [https://github.com/gatoatigrado/vimap] yazmaya başladım (ve iş parçacığı çatallı olduğunda bunu netleştirir). – gatoatigrado

+1

@Bartosz, Bunun neden ipython defterlerinde bir sorun olmadığını biliyor musunuz? – Framester

4

Bu seferki çalışır:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == "__main__": 
    p = Pool(1) 
    p.map(f, [1, 2, 3]) 

Ben senin kod neden çalışmıyor emin% 100 değilim, ama ben Bunun sebebi, multiprocessing modülü tarafından başlatılan çocuk süreçlerinin ana modülü (Tanımladığınız yöntemler) ve if __name__ == "__main__" stanza, havuzunuzu ayarladığınız başlangıç ​​kodunu çalıştırma gereği duymaz.

+0

Windows'da bir tercüman aracılığıyla böyle bir kod çalıştırmak gerekiyorsa, etrafta bir iş var mı? Bu, Gimp Python Console eklentisinden bazı Python-Fu programlaması yapmakla karşılaştığım durumdur. – jxramos

+0

Bu benim için çalışmadı –

1

Bir olasılık da piton dosyası bir modül olarak aynı ada sahip olmasıdır:

  • test.py
  • test/
    • __init__.py
Pickle.py dosyasında

, hatanın varsa g dan:

def find_class(self, module, name): 
     # Subclasses may override this 
     __import__(module) 
     mod = sys.modules[module] # <- here mod will reference your test/__init__.py 
     klass = getattr(mod, name) 
     return klass 
İlgili konular