3
aşağıdaki şekilde birden süreçleri oluşturmak için Python'un multiprocessing.Pool kütüphanesini kullanıyorum

ile başarısız Parametreler için, öğretici için bkz. http://zqdevres.qiniucdn.com/data/20150702120338/index.html.PyInstaller dahili Windows EXE multiprocessing.pool

Proje, PyInstaller 3.1.1 kullanılarak tek bir Windows EXE'de paketleniyor. --onedir seçeneği ile. PyInstaller EXE'i sorun yaratmadan oluşturur ve programın çok parçalı kullanımı olmayan bölümleri sorunsuz bir şekilde yürütebilirim.

Yukarıdaki çoklu işlem işlevini kullanan programın bölümlerini çalıştırmaya çalıştığımda sorunum geliyor.

File "multiprocessing\context.py", line 148, in freeze_support 
    File "multiprocessing\spawn.py", line 74, in freeze_support 
    File "multiprocessing\spawn.py", line 106, in spawn_main 
    File "multiprocessing\spawn.py", line 115, in _main 
    File "multiprocessing\spawn.py", line 221, in prepare 
    File "multiprocessing\context.py", line 231, in set_start_method 
RuntimeError: context has already been set 
classifier_v3_gui returned -1 

freeze_support ana birinci hat olarak çağrısı içermelidir https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing bir öneri olarak gelir:

Ardından, program (ve üzeri her çocuk parçacığı tarafından üzerine yazılmış) aşağıdaki hata iletisiyle başarısız olur benzer bir sorun PyInstaller-built Windows EXE fails with multiprocessing tartışılan ve bununla birlikte, a) --onedir için tartışılan çözüm hatadan görebileceğiniz gibi, benim için çalışmaya görünmüyor, yukarıdaki bağlantıda çözümü anlamına gelir olmuştur
if name == "__main__": 
    multiprocessing.freeze_support() 

aldığım mesaj, b) _Popen'in Pool-ing ile ilgili olduğunu bilmiyorum, bu yüzden --onefile için nasıl bile bilmiyorum sınıf yeniden tanımlamasını uygulamak.

Çok işlemcili.freeze_support() işlevini ana bilgisayarda kullanmazsam, program RuntimeError uygulamasının gerçekleşmemesi nedeniyle farklı davranır; bunun yerine programımın her defasında cmd'ye yazdırılan programın kullanım talimatlarını alıyorum. ortaya çıkması beklenen bir şey değil, EXE'i kendileri çağırmaya çalışan, ortaya çıkan süreçlerin.

Programın bir .py betiği gibi bir sorun olmadan çalıştığını söylemeye gerek yok. Ben 32 bit Python 3.4 kullanıyorum

Aklıma 10.

yalnızca diğer çözüm çoklu işlem kullanmak benim çözüm yeniden yazmak olduğunu Windows üzerinde (Python 2.7 ile de aynı çoklu sorunu vardı). İşlemin yerine çoklu işlem yapılması. Havuz işlevimin ne yaptığını yapmak için oldukça düşük bir çabanız varsa, buna razı olacağım.

+0

Merhaba @Mjellma sorunuza cevap verebilir misiniz? Anladığım kadarıyla bu hatayı halledebildiniz. – mathiasfk

cevap

1

Sorununuza bir çözüm buldunuz mu? Aynı tür bir sorunu yaşıyorum, ancak bunu basit bir kodla çalıştırmayı başardım. Ancak henüz tam kodumla çalışmaz (sklearn kullanarak). Çalışmayı başarırsanız, bana bildirin, bana da yardımcı olabilir. Başvurumu derlemek pyinstaller içinde "-D" seçeneğini (bir dizin) kullanıyorum

import multiprocessing 
import time 

def func (param1, param2): 
    print ("hello " + str (param1)) 
    time.sleep (param2) 
    print ("Hello again " + str (param1)) 
    return "test " + str (param1) 

def main(): 
    lParams = [("test1", 3), 
       ("test2", 2), 
       ("test3", 1)] 
    args = [] 
    for param1, param2 in lParams: 
     tup = (param1, param2) 
     args.append (tup) 

    with multiprocessing.Pool (multiprocessing.cpu_count()) as p: 
     results = [p.apply_async (func, a) for a in args] 
     for r in results: 
      print ("Returned " + r.get()) 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    main() 

Not: Burada

benim için çalıştı kodlamasıdır.

+0

Benim için çalışmamla sonuçlanan şey, kütüphaneleri fonksiyon kapsamına ve küresel ad alanının dışına aktarmaktı. Bu bir süre önce olduğu için, neden artık olduğunu hatırlayamıyorum, ama kütüphane ithalatının etrafta dolaştığını ve devam edip sonunda projemi bitirebileceğim bir yere geldiğimi hatırlıyorum. Eğer bu işe yaramazsa ve hala sorun yaşıyorsanız, bana haber verin ve her zaman kodu sizinle paylaşabilirim, böylece daha yakından bakabilmeniz için, sonuçta bir şekilde düzgün çalışıyordu. – Mjellma

İlgili konular