Форум сайта python.su
1
В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные. Как все это ??? что-бы закрутилось. Вот прототип программы
from MPU import MPU import multiprocessing def ReadMpu(self, gyro): while True: # читаем гироскоп self.gyro = [1.0,2.0,3.0,4.0,5.0,6.0,7.0] gyro = [1,1,1,1,1,1,1] pid = multiprocessing.Process( target = mpu.ReadMpu, args = [gyro]) pid.start() while True: gyr = gyro ReadMpu(gyr) print(gir) #Тут работают ещё два независимых процесса
Отредактировано Dmti (Март 3, 2019 13:36:17)
Офлайн
1
Хорошо тогда так:
from MPU import MPU import multiprocessing def ReadMpu(self, gyro): while True: # читаем гироскоп print('----------------- УРРАААААААаааа----------------') self.gyro = [1.0,2.0,3.0,4.0,5.0,6.0,7.0] gyro = [1,1,1,1,1,1,1] pid = multiprocessing.Process( target = mpu.ReadMpu, args = [gyro]) pid.start() while True: gyr = gyro delay(500) print(gir) #Тут работают ещё два независимых процесса
Отредактировано Dmti (Март 3, 2019 14:10:07)
Офлайн
294
Dmtiэто не прототип программы, это черте-что и сбоку бантик.
Вот прототип программы
from multiprocessing import Pipe, Process from random import randint import time def read_mpu(pipe_conn): # pipe_conn - один и концов "трубы" while True: # читаем гироскоп print('----------------- УРРАААААААаааа----------------') gyro = [randint(0,10),randint(0,10),randint(0,10),randint(0,10),randint(0,10),randint(0,10),randint(0,10)] pipe_conn.send(gyro) # передаем в "трубу" показания time.sleep(2) # просто пауза, чтобы нас не "засыпало" данными, эта жи пример :) if __name__ == '__main__': first_conn, second_conn = Pipe() # создаем "трубу", получаем ссылку на два ее конца pid = Process(target = read_mpu, args = [second_conn,]) # создаем процесс, и передаем ему один конец "трубы" pid.start() while True: if first_conn.poll(0.5): # опрашиваем "трубу" есть ли в ней данные, с таймаутом 0.5 сек. val = first_conn.recv() # если таки там чтото есть, забираем print(val)
[code python][/code]
Отредактировано PEHDOM (Март 3, 2019 19:36:46)
Офлайн
1
1. ваш ReadMpu принимает два аргумента а вы ему передаете один, (или семь, но в общем все равно неправильное количество)
Ну подскажите как правильно массив передать я толком не нашел путевого примера.
2. на кой ляд там self? это же не метод класса.
На самом деле это метод класса MPU но для упрощения примера это не важно и я не показал класс а self забыл убрать ИЗВИНИТЕ.
3. Функция ReadMpu на самом деле длинная она опрашивает устройство рассчитывает и накапливает ошибки она должна работать не останавливаясь и за время опроса массива она обновляет его 7-10 раз а для простаты показал что должна постоянно обновлять массив. Чего она не делает и разобраться пока в веду не образованности не получается.
Отредактировано Dmti (Март 4, 2019 12:56:52)
Офлайн
1
Передрал ваш пример и если честно то ни хрена не понял.
# from MPU import MPU import multiprocessing # def ReadMpu(gyro): while True: # читаем гироскоп print('----------------- УРРАААААААаааа----------------') gyro = [1.0,2.0,3.0,4.0,5.0,6.0,7.0] pipe_conn.send(gyro) # # gyro = [1,1,1,1,1,1,1] first_conn, second_conn = Pipe() # pid = multiprocessing.Process( target = mpu.ReadMpu, args = [second_conn,]) pid.start() # while True: gyro = irst_conn.recv() delay(500) print(gir) #Тут работают ещё два независимых процесса
Офлайн
186
> В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные
Для такой задачи нужно потоки использовать, а не процессы. Список который шариться между потоками должен быть потокобезовастным, либо копироваться.
Отредактировано Rodegast (Март 4, 2019 13:36:37)
Офлайн
1
в учебнике написано: Note that data in a pipe may become corrupted if two processes (or threads) try to read from or write to the same end of the pipe at the same time. А такие моменты при асинхронном обращении будут возникать постоянно. Вопрос что делать и как быть?
Офлайн
1
Один процесс работает с устройством и только на его условиях с его скоростью. Два процесса работают с сетью если их объединить то начинают подтормаживать игры. И последний работает с экраном и объединяет все предыдущие. Это по вопросу зачем столько процессов.
Офлайн
1
# from multiprocessing import Process, Pipe # def ReadMpu(conn): while True: print('----- УРРАААААААаааа-----') #не печатает gyr = [1.0,2.0,3.0,4.0,5.0] conn.send(gyr) conn.clouse() # if __name__ == '__main__': gyro = [1,1,1,1,1] first_conn, second_conn = Pipe() # pid = Process(target = ReadMpu, args = [second_conn,]) pid.start() print(pid) # печатает <Process(Process-1, started)> # while True: if first_conn.poll(0.5): gyro = first_conn.recv() print(gyro) #печатает 1,1,1,1,1 а надо 1.0,2.0,3.0,4.0,5.0 №
Отредактировано Dmti (Март 4, 2019 16:23:54)
Офлайн
294
DmtiЯ ж не знаю чего там у вас понагорожено, что там за асихронность у вас и исхожу только из вашего“прототипа”. В вашем “прототипе”только один подпроцесс. он пишет в один конец, а основной процесс только читает с другого. Никаких осложнений быть не должно. Вот если у вас два процесса будут писать или читать в один конец, тогда да, у вас будут проблемы. НО повторюсь, из “протипа” это никак не следует.
в учебнике написано: Note that data in a pipe may become corrupted if two processes (or threads) try to read from or write to the same end of the pipe at the same time. А такие моменты при асинхронном обращении будут возникать постоянно. Вопрос что делать и как быть?
Dmtiвсе запускаеться, но вопервых чтобы увидеть ('—– УРРАААААААаааа—–') нужно запускать в консоли, а не в IDE
Цикл так и не запускается в терминал выводится что процесс запущен и тишина
from multiprocessing import Process, Pipe # def ReadMpu(conn): while True: print('----- УРРАААААААаааа-----') gyr = [1.0,2.0,3.0,4.0,5.0] conn.send(gyr) # if __name__ == '__main__': gyro = [1,1,1,1,1] first_conn, second_conn = Pipe() # pid = Process(target = ReadMpu, args = [second_conn,]) pid.start() print(pid) # while True: if first_conn.poll(0.5): gyro = first_conn.recv() print(gyro) >>> ----- УРРАААААААаааа----- ----- УРРАААААААаааа----- ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] [1.0, 2.0, 3.0, 4.0, 5.0] ----- УРРАААААААаааа----- [1.0, 2.0, 3.0, 4.0, 5.0] [1.0, 2.0, 3.0, 4.0, 5.0] ..... >>>
[code python][/code]
Отредактировано PEHDOM (Март 4, 2019 17:58:24)
Офлайн