我一直在阅读并试图在我的程序中实现多线程,但不管我怎么做,它都不会并行运行我的函数。我使用传感器作为树莓派3,尝试让它们并行打印状态,而不是等待一个完成,然后转到下一个功能。
现在发生的事情是它在程序检查秒传感器之前等待那20秒并打印出该状态消息。我不明白为什么!
代码:
import RPi.GPIO as GPIO
import time
from multiprocessing import Process
''' Define pins and setup the sensors '''
def runInParallel(*fns):
proc = []
for fn in fns:
p = Process(target=fn)
p.start()
proc.append(p)
for p in proc:
p.join()
def sensor1():
#Sleep timer long so I can check that I can see prints from 2nd sensor while this thread is sleeping
time.sleep(20)
#Get status from sensor---
if status == 1:
print "Ouch!"
else:
print "Good!"
def sensor2():
time.sleep(0.2)
#Get status from 2nd sensor---
if status == 1:
print "Ouch2!"
else:
print "Good2!"
runInParallel(sensor1, sensor2)
答案 0 :(得分:1)
我不知道为什么你的例子不起作用,但我试过这个:
import time
from threading import Thread
''' Define pins and setup the sensors '''
status = 0
def runInParallel(*fns):
proc = []
for fn in fns:
p = Thread(target=fn)
proc.append(p)
for p in proc:
p.start()
def sensor1():
#Sleep timer long so I can check that I can see prints from 2nd sensor while this thread is sleeping
time.sleep(.2)
#Get status from sensor---
if status == 1:
print("Ouch!")
else:
print("Good!")
def sensor2():
time.sleep(0.2)
#Get status from 2nd sensor---
if status == 1:
print("Ouch2!")
else:
print("Good2!")
runInParallel(sensor1, sensor2)
几乎同时输出good2
和good
。如果你真的需要输出是准确的,那么试着调试你的例子,但是如果比用肉眼可以注意到的更接近就可以了,那么我认为线程模块可以运行得很好。
好吧我认为你的问题是你认为Process.join()
计算函数中的等待。 Process.join()
仅确保函数同时启动。如果您在一个功能中等待,那么runInParallel
将不关心这一点。