0

私は、スタンドアロン アプリケーションとして配布することを目的とした小さな python に取り組んでいます。実行を非常に高速にするのに役立つので、並列pythonを使用したいと思います。この次の例では、pyinstaller を介して実行可能ファイルを作成すると、それが呼び出されたときにpp.Server()新しいウィンドウが起動します。新しいウィンドウを閉じると、パイプ エラーが発生します。

この問題が発生するスクリプトの例を次に示します。

import pp, os, sys, multiprocessing
from bs4 import BeautifulSoup as Soup
from PyQt4 import QtCore, QtGui


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(188, 119)
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.horizontalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        pass

class TestClass(object):
    __slots__ = ('var')
    def __init__(self): 
        self.var = 'a string'
    def doSomething (self, input_string) : 
        self.var = input_string

class PPTask (object) :
    def __init__ (self) :
        pass
    def ppTask(self, file = '') :
        html = open(file).read()
        soup = Soup(html)
        ret_results = []
        for i in xrange(10) : 
            tc = parallel_tests.TestClass()
            s = str(soup.title.string) # if it is not put in string it won't work in multithreading....
            #~ tc.doSomething(soup.title.string) # this doesn't works
            tc.doSomething(s) # this works if s is a string not a "soup string"
            ret_results.append(tc)
        return ret_results

class Window(QtGui.QMainWindow) : 
    def __init__ (self, parent = None) :
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.createSignals()
    def createSignals(self): 
        QtCore.QObject.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.doItBaby)
    def doItBaby (self) :
        print('it works until here ')
        try : 
            job_server = pp.Server() # this creates a new mainwindow ! 
        except Exception, e : 
            print("I supposed you've just closed the new window created haven't you? " + str(e))
        job_list = []
        results = []
        cmpt = 0
        for i in xrange(100) : 
            pt = PPTask()
            job_list.append(job_server.submit(pt.ppTask, ('anHTMfile.htm',),modules = ("parallel_tests","from bs4 import BeautifulSoup as Soup")))
        for job in job_list : 
            results.append(job())
        for result in results :
            for item in result :
                print 'cmpt = ' + str(cmpt)
                cmpt += 1
                print item.var

if __name__ == '__main__':
    multiprocessing.freeze_support()    
    current_dir = os.getcwd()
    app = QtGui.QApplication(sys.argv)
    ui = Window()
    ui.show()
    sys.exit(app.exec_())

freeze_support() を追加しようとしましたが、期待どおりには役に立ちませんでした。

誰かが私を助けることができれば、私は感謝します.

4

2 に答える 2

0

並列Pythonには公式のフリーズサポートがないようです。他の誰かがpy2exeを介して同じ問題を抱えているようです:http:
//www.parallelpython.com/component/option,com_smf/Itemid,1/topic,161.0/wap2,wap2

マルチプロセッシングフリーズの使用は、そのモジュールを使用している場合は機能しますが、PPモジュールには影響しません。

問題は、ワーカーではなくメインアプリを再度起動するため、アプリの別のインスタンスが表示されることです。PPはIPCを使用して通信するため、ウィンドウを強制終了すると、通信パイプが強制終了され、PPは文句を言います。

于 2012-05-08T01:29:54.437 に答える
0

試したことはありませんが、おそらく、新しいウィンドウを閉じると、オブジェクトへの参照がなくなり、ガベージコレクションが行われるためです。
とにかく、GUIですべてのことが起こっているのはあまり良いデザインではありません。

于 2012-05-07T21:30:29.840 に答える