Найти - Пользователи
Полная версия: Process не получается правильно вернуть массив
Начало » Python для новичков » Process не получается правильно вернуть массив
1 2
Dmti
В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные. Как все это ??? что-бы закрутилось. Вот прототип программы
 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
Хорошо тогда так:
  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)
    #Тут работают ещё два независимых процесса

ура не печатает, цикл не запущен что не правильно?
PEHDOM
Dmti
Вот прототип программы
это не прототип программы, это черте-что и сбоку бантик.
У вас поток не запуститься,
потому что: ваш ReadMpu приннимает два аргумента а вы ему передаете один, (или семь, но вобщем всеравно неправильное колличество)
и вообще накой ляд там self? это же не метод класса.
Накой вы вообще передаете туды gyro? а вот тут gyr = gyro совсем непонятно, если вы хотите получить данные из процесса, то это делается совсем не так.


 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)
подробнее про процессы и способы сообщения между ними https://docs.python.org/3/library/multiprocessing.html
Dmti
1. ваш ReadMpu принимает два аргумента а вы ему передаете один, (или семь, но в общем все равно неправильное количество)
Ну подскажите как правильно массив передать я толком не нашел путевого примера.

2. на кой ляд там self? это же не метод класса.
На самом деле это метод класса MPU но для упрощения примера это не важно и я не показал класс а self забыл убрать ИЗВИНИТЕ.
3. Функция ReadMpu на самом деле длинная она опрашивает устройство рассчитывает и накапливает ошибки она должна работать не останавливаясь и за время опроса массива она обновляет его 7-10 раз а для простаты показал что должна постоянно обновлять массив. Чего она не делает и разобраться пока в веду не образованности не получается.
Dmti
Передрал ваш пример и если честно то ни хрена не понял.
 #
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)
    #Тут работают ещё два независимых процесса
Сейчас сижу читаю учебник про Pipe() я пока о такой функции не знал.
Rodegast
> В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные

Для такой задачи нужно потоки использовать, а не процессы. Список который шариться между потоками должен быть потокобезовастным, либо копироваться.
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
Один процесс работает с устройством и только на его условиях с его скоростью. Два процесса работают с сетью если их объединить то начинают подтормаживать игры. И последний работает с экраном и объединяет все предыдущие. Это по вопросу зачем столько процессов.
Dmti
 #
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


Цикл так и не запускается в терминал выводится что процесс запущен и тишина
PEHDOM
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]
.....
>>>
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