[英]How do I run two while True statements in python?
我正在嘗試使用Python為我的Raspberry Pi創建門刷卡系統。 我將程序分為兩部分:門禁警報和刷卡記錄系統。 這兩個程序可以單獨工作,但是如何將兩個程序合並為一個python文件? 我試過線程,但似乎無法正常工作。
以下是程序:1.)門警報:如果門在一定時間內保持打開狀態,指示燈會閃爍,然后警報會響起
import time
import RPi.GPIO as gpio
led = 37
buzzer = 11
door = 16
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)
def blink(buzzer):
gpio.output(buzzer, True)
time.sleep(0.1)
gpio.output(buzzer, False)
time.sleep(0.1)
return
def blink(led):
gpio.output(led, True)
time.sleep(1)
gpio.output(led, False)
time.sleep(1)
return
while True:
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
gpio.cleanup()
2.)刷卡記錄系統:當有人刷卡時,指示燈閃爍並拍照
import datetime
import time
import os
import RPi.GPIO as gpio
led = 37
t = datetime.datetime.now()
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(led, gpio.OUT)
def blink(led):
gpio.output(led, True)
time.sleep(0.1)
gpio.output(led, False)
time.sleep(0.1)
while True:
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
gpio.cleanup()
(更新)另外,下面是我嘗試線程化的嘗試:
import time
import RPi.GPIO as gpio
import os
import datetime
from threading import Thread
led = 37
buzzer = 11
door = 16
t = datetime.datetime.now()
gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(buzzer, gpio.OUT)
gpio.setup(led, gpio.OUT)
gpio.setup(door, gpio.IN, pull_up_down=gpio.PUD_UP)
def blink(buzzer):
gpio.output(buzzer, True)
time.sleep(0.1)
gpio.output(buzzer, False)
time.sleep(0.1)
return
def blink(led):
gpio.output(led, True)
time.sleep(1)
gpio.output(led, False)
time.sleep(1)
return
def doorsensor():
while True:
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
def cardreader():
while True:
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())
f2.start()
f1.start()
gpio.cleanup()
我正在介紹一種無線程方法。 這個想法是將您的while
身體轉變為update
功能,然后交替調用它們。
首先,你的門環變成
def update_door():
if gpio.input(door):
time.sleep(3)
for i in range(0,5):
blink(led)
for i in range (0,5):
blink(buzzer)
else:
gpio.output(buzzer, False)
然后,您的刷卡記錄系統將變為
def update_card():
card = raw_input()
f = open("Laptop Sign Out" + '.txt', 'a')
f.write("OneCard Number: " + card[1:10] + " Time: " + t.strftime("%m-%d-%Y %H:%M:%S"))
f.write('\n')
f.write(';')
f.write('\n')
f.close()
time.sleep(1)
for i in range(0,3):
blink(led)
os.system('fswebcam ~/Desktop/Photos/%H%M%S.jpeg')
time.sleep(3)
最后,您的主循環變為:
while True:
update_door()
update_card()
但是,一個問題出現了: time.sleep
在update_card
將推遲update_door
為好。 在這里,您有三種解決方案:
1-如果update_door
被延遲也可以
好吧
2-如果update_door
延遲不可以,但是如果update_card
不延遲也可以
然后只需刪除time.sleep(3)
。
3-您需要不延遲update_door
和延遲update_card
然后,您可以使用time
模塊設置手動計時器。
lastCardUpdate = time.time()
while True:
update_door()
now = time.time()
if now - lastCardUpdate >= 3:
update_card()
lastCardUpdate = now
但是update_card
中的raw_input
是一種阻塞方法,正在等待用戶輸入。 如果確實需要每三秒鍾進行一次此用戶輸入,則不能使用此方法。 如果您可以將其移動到while
之前,即在update_card
函數外部,則可以。 否則,您確實確實需要使用線程。
您需要將線程函數作為target
參數而不是它們的返回值傳遞:
import sleep
f1 = Thread(target=doorsensor) # Remove parentheses after doorsensor
f1.daemon = True
f1.start()
f2 = Thread(target=cardreader) # Remove parentheses after cardreader
f2.daemon = True
f2.start()
# Use a try block to catch Ctrl+C
try:
# Use a while loop to keep the program from exiting and killing the threads
while True:
time.sleep(1.0)
except KeyboardInterrupt:
pass
gpio.cleanup()
在每個線程上設置daemon
屬性,以便僅保留守護程序線程時程序將退出:
線程可以標記為“守護程序線程”。 該標志的重要性在於,僅保留守護程序線程時,整個Python程序都會退出。 初始值是從創建線程繼承的。 可以通過daemon屬性設置該標志。
如果您試圖同時運行這兩個程序,那么您將不得不使用您嘗試過的線程或多處理程序。 如果您有,我們可能會看到您的嘗試,因為我們可能會在那里幫助您解決問題。
另一個問題是,所有方法的名稱都稱為Blink,這在Python中是不允許的,在python中,所有方法的名稱應不同。
編輯:對於線程,請確保鍵入threading.Thread(target = target)
作為您的代碼
不管其他任何錯誤,一旦啟動線程,就需要加入其中一個線程。
f1 = Thread(target = doorsensor())
f2 = Thread(target = cardreader())
f2.start()
f1.start()
f1.join()
f1.join()
什么作用?
基本上,它告訴Python等待f1
完成運行。 如果您不這樣做,程序將啟動f1
和f2
,然后退出。 退出后,Python將釋放所有資源,包括將停止執行的那兩個線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.