#python
#python
Вопрос:
Я новичок в Python, но я работаю над проектом, в котором мне нужно подключить 3 или более ультразвуковых датчика одновременно. Я прочитал все о потоках, и многопроцессорная обработка успешно выполнила пару примеров. Я знаю, что код должен быть запущен из командной строки или терминала PI2. Однако многопроцессорный код, который я написал, не работает, и я не могу понять, почему. Кто-нибудь, пожалуйста, может мне помочь.
from multiprocessing import Process
from gpiozero import DistanceSensor
ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_C = DistanceSensor(echo=12, trigger=16)
ultrasonic.max_distance = 1
ultrasonic_B.max_distance = 1
ultrasonic_C.max_distance = 1
def A(name):
while True:
ultrasonic.wait_for_in_range()
print('Distance')
if ultrasonic.wait_for_out_of_range():
print('Out of range')
def B(name):
while True:
ultrasonic_B.wait_for_in_range()
print('Distance_B')
if ultrasonic_B.wait_for_out_in_range():
print('Out of range_B')
def C(name):
while True:
ultrasonic_C.wait_for_in_range()
print('Distance_B')
if ultrasonic_C.wait_for_out_in_range():
print('Out of range_B')
if __name__ == "__main__":
p = Process(target=A)
p1 = Process(target=B)
p2 = Process(target=C)
p.start()
p1.start()
p2.start()
Я принял во внимание ваши предложения и смог заставить первый цикл работать, но остальные 2 цикла мне ничего не дали. Вот обновленный код
from multiprocessing import Process
from gpiozero import DistanceSensor
ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_C = DistanceSensor(echo=12, trigger=16)
ultrasonic.max_distance = 1
ultrasonic_B.max_distance = 1
ultrasonic_C.max_distance = 1
def A():
while ultrasonic.wait_for_in_range():
print('Distance')
if ultrasonic.wait_for_out_of_range():
print('Out of range')
def B():
while ultrasonic_B.wait_for_in_range():
print('Distance_B')
if ultrasonic_B.wait_for_out_in_range():
print('Out of range_B')
def C():
while ultrasonic_C.wait_for_in_range():
print('Distance_B')
if ultrasonic_C.wait_for_out_in_range():
print('Out of range_B')
if __name__ == "__main__":
p = Process(target=A)
p1 = Process(target=B)
p2 = Process(target=C)
p.run()
p1.run()
p2.run()
Результат приходит из первого цикла
Расстояние
Вне зоны действия
Расстояние
Вне зоны действия
Хорошо, это то, что у меня есть
from multiprocessing import Process
from gpiozero import DistanceSensor
ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_C = DistanceSensor(echo=12, trigger=16)
ultrasonic.max_distance = 1
ultrasonic_B.max_distance = 1
ultrasonic_C.max_distance = 1
def A():
while ultrasonic.wait_for_in_range():
print('Distance')
if ultrasonic.wait_for_out_of_range():
print('Out of range')
def B():
while ultrasonic_B.wait_for_in_range():
print('Distance_B')
if ultrasonic_B.wait_for_out_in_range():
print('Out of range_B')
def C():
while ultrasonic_C.wait_for_in_range():
print('Distance_B')
if ultrasonic_C.wait_for_out_in_range():
print('Out of range_B')
if __name__ == "__main__":
p = Process(target=A)
p1 = Process(target=B)
p2 = Process(target=C)
p.start()
p1.start()
p2.start()
Комментарии:
1. В чем ошибка / проблема? Код, который я написал, не работает , очень общий
Ответ №1:
Вы не говорите, что вы имеете в виду под «не работает», поэтому я беру несколько предположений здесь.
Очевидной ошибкой здесь было бы:
TypeError: A() принимает ровно 1 аргумент (задано 0)
Поскольку функции A
, B
и C
все принимают аргумент name
, и вы не предоставляете его в Process(target=A)
. Это работает, если вы просто удалите параметр из функций, поскольку вы даже не используете его.
Вы также можете указать аргумент в вызове следующим образом:
p = Process(target=A, args=('ultra_a',))
Другим может быть ошибка отступа, по крайней мере, в вашей вставке кода у вас есть один дополнительный пробел в каждой строке до определения B.
Комментарии:
1. Большое вам спасибо, Теему Рисикко, я постараюсь применить ваши предложения.
2. @Manny Нет проблем, и добро пожаловать в Stackoverflow! Если ответ решит вашу проблему, не забудьте пометить его как принятый, чтобы другие тоже выиграли от этого!
3. Эй, я внес некоторые изменения и смог заставить один цикл работать, но другие 2 цикла не дают результатов. Не могли бы вы помочь мне, если можете. Спасибо
4. Это не работает, потому что вы изменили
p.start()
наp.run()
. Например, он продолжает запускать только первый процесс. Измените их обратно, и это должно сработать.5. Я просто сделал то, что вы сказали, и ничего не произошло (никаких ошибок, это просто пустое). Извините, я знаю, что это должно быть легко, но я просто не понимаю, почему это не работает :(.
Ответ №2:
import multiprocess
from gpiozero import DistanceSensor
def A():
ultrasonic = DistanceSensor(echo=18, trigger=23)
ultrasonic.max_distance = 1
while ultrasonic.wait_for_in_range():
print('Sensor_1' ultrasonic.distance, 'm')
if ultrasonic.wait_for_out_of_range():
print('0')
def B():
ultrasonic_B = DistanceSensor(echo=25, trigger=24)
ultrasonic_B.max_distance = 1
while ultrasonic_B.wait_for_in_range():
print('Sensor_2', ultrasonic_B.distance, 'm')
if ultrasonic_B.wait_for_out_in_range():
print('0')
def C():
ultrasonic_C = DistanceSensor(echo=12, trigger=16)
ultrasonic_C.max_distance = 1
while ultrasonic_C.wait_for_in_range():
print('Sensor_3',ultrasonic_C.distance, 'm')
if ultrasonic_C.wait_for_out_in_range():
print('0')
if __name__ == "__main__":
p = multiprocess.Process(target=A)
p1 = multiprocess.Process(target=B)
p2 = multiprocess.Process(target=C)
p.start()
p1.start()
p2.start()
Комментарии:
1. * Обратите внимание, что библиотека gpiozero нуждается в этом!