Найти - Пользователи
Полная версия: multiprocessing Python
Начало » Python для новичков » multiprocessing Python
1
adray0001
Здравствуйте дорогие форумчане.
У меня следующая проблема мне нужно по нажатию кнопки стартовать и останавливать процесс в котором цикл while.
В связи с этим вопрос как мне передать значение флага в процесс вот мой код но он не работает.(
 import multiprocessing
from PyQt4 import QtCore, QtGui, uic
import sys
class Work_Proc(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.flag = False
    def run(self):
        while self.flag:
            print(2)
class Widget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        uic.loadUi('untitled.ui', self)
        self.connect(self.pushButton, QtCore.SIGNAL('clicked()'), self.start)
    def start(self):
        work.flag = True
if __name__ == "__main__":
    app = QtGui.QApplication([])
    work = Work_Proc()
    work.start()
    window=Widget()
    window.show()
    if __name__ == '__main__':
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()
PEHDOM

в мультипроцессингое для обмена используются Pipe или Queue
adray0001
А подскажите как мне это приспособить к моему коду ?? Я знаю про pipe еще я использовал в другом приложении sharedmemory. Но как мне использовать это в моем коде я не могу понять. И мне очень важно быстродействие. То есть в отдельно процессе у меня будет идти опрос устройства которое непрерывно шлет данные и в момент нажатия мне нужно закончить этот опрос и перейти к другой функции которая будет выполнятся в этом же процессе.
PEHDOM
ХЗ наколько это правильно, но както так работает:
 #
from multiprocessing import Process, Pipe
from PyQt4 import QtGui
class Work_Proc(Process):
    def __init__(self, pipe):
        Process.__init__(self)
        self.pipe = pipe
    def run(self):
        file = open('output.log', 'w')
        file.write('porcess started\n')
        while True:
            # бесконечный цикл
            if self.pipe.poll():
                # Проверяем есть ли чтото в трубе, если есть:
                if self.pipe.recv() == 'stop':
                    # Читаем что там, если пршло слово "stop" Прерываем цикл
                    file.write('stop working.\n')
                    break
            # Тут какаято работа внутри бесконечного цикла
            file.write('I`m working....\n')
        # Тут работа после прерывания цикла, например вызов другой процедуры
        file.write('Other work runing....\n')
        file.close()
        return
class Widget(QtGui.QWidget):
    def __init__(self, pipe):
        QtGui.QWidget.__init__(self)
        self.pipe = pipe
        layout = QtGui.QVBoxLayout(self)
        self.pushButton= QtGui.QPushButton('stop', self)
        self.pushButton.clicked.connect(self.stop)
        layout.addWidget(self.pushButton)
    def stop(self):
        self.pipe.send('stop') # Послаем в "трубу" слово стоп
if __name__ == "__main__":
    app = QtGui.QApplication([])
    end1_pipe, end2_pipe = Pipe() # Создаем "трубу"
    window=Widget(end2_pipe) # Один конец "трубы" перелаем виджету
    window.show()
    work = Work_Proc(end1_pipe) # второй конец "трубы" передаем процессу
    work.start() # Запускаем процесс
    app.exec_()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB