簡體   English   中英

如何在python中運行兩個while True語句?

[英]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.sleepupdate_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完成運行。 如果您不這樣做,程序將啟動f1f2 ,然后退出。 退出后,Python將釋放所有資源,包括將停止執行的那兩個線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM