如何在python中运行两个while True语句?

Dra*_*okh 5 python raspberry-pi

我正在尝试使用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()      
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

(更新)另外,下面是我尝试线程化的尝试:

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()   
Run Code Online (Sandbox Code Playgroud)

小智 1

您需要将线程函数作为target参数传递,而不是它们的返回值:

\n\n
import sleep\n\nf1 = Thread(target=doorsensor) # Remove parentheses after doorsensor\nf1.daemon = True\nf1.start()\nf2 = Thread(target=cardreader) # Remove parentheses after cardreader\nf2.daemon = True\nf2.start()\n\n# Use a try block to catch Ctrl+C\ntry:\n    # Use a while loop to keep the program from exiting and killing the threads\n    while True:\n        time.sleep(1.0)\nexcept KeyboardInterrupt:\n    pass\n\ngpio.cleanup()\n
Run Code Online (Sandbox Code Playgroud)\n\n

在每个线程上设置该daemon属性,以便当只剩下守护线程时程序将退出:

\n\n
\n

线程可以标记为 \xe2\x80\x9cdaemon 线程\xe2\x80\x9d。该标志的意义在于,当只剩下守护线程时,整个Python程序就会退出。初始值是从创建线程继承的。该标志可以通过 daemon 属性来设置。

\n
\n