Уведомления

Группа в Telegram: @pythonsu

#1 Март 3, 2019 13:06:07

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные. Как все это ??? что-бы закрутилось. Вот прототип программы

 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)

Офлайн

#2 Март 3, 2019 14:08:23

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

Хорошо тогда так:

  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)

Офлайн

#3 Март 3, 2019 19:19:21

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 3, 2019 19:36:46)

Офлайн

#4 Март 4, 2019 12:42:53

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

1. ваш ReadMpu принимает два аргумента а вы ему передаете один, (или семь, но в общем все равно неправильное количество)
Ну подскажите как правильно массив передать я толком не нашел путевого примера.

2. на кой ляд там self? это же не метод класса.
На самом деле это метод класса MPU но для упрощения примера это не важно и я не показал класс а self забыл убрать ИЗВИНИТЕ.
3. Функция ReadMpu на самом деле длинная она опрашивает устройство рассчитывает и накапливает ошибки она должна работать не останавливаясь и за время опроса массива она обновляет его 7-10 раз а для простаты показал что должна постоянно обновлять массив. Чего она не делает и разобраться пока в веду не образованности не получается.

Отредактировано Dmti (Март 4, 2019 12:56:52)

Офлайн

#5 Март 4, 2019 13:31:35

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

Передрал ваш пример и если честно то ни хрена не понял.

 #
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() я пока о такой функции не знал.

Офлайн

#6 Март 4, 2019 13:36:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

> В соседнем процессе есть бесконечный цикл он должен постоянно накапливать и обновлять массив а в основном процессе периодически скидывать накопленные данные

Для такой задачи нужно потоки использовать, а не процессы. Список который шариться между потоками должен быть потокобезовастным, либо копироваться.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Март 4, 2019 13:36:37)

Офлайн

#7 Март 4, 2019 13:38:18

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

в учебнике написано: 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. А такие моменты при асинхронном обращении будут возникать постоянно. Вопрос что делать и как быть?

Офлайн

#8 Март 4, 2019 13:45:55

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

Один процесс работает с устройством и только на его условиях с его скоростью. Два процесса работают с сетью если их объединить то начинают подтормаживать игры. И последний работает с экраном и объединяет все предыдущие. Это по вопросу зачем столько процессов.

Офлайн

#9 Март 4, 2019 15:57:29

Dmti
Зарегистрирован: 2019-03-02
Сообщения: 23
Репутация: +  1  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

 #
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)

Офлайн

#10 Март 4, 2019 17:56:13

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Process не получается правильно вернуть массив

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version