Python线程

问题描述 投票:2回答:3

完整的python新手...我正在使用Arduino pyfirmata软件包,我正在尝试做一些非常简单的事情。

取决于用户对python的输入,我希望LED闪烁还是不闪烁。

我的问题是python程序仅要求用户输入一次,但我希望它始终要求输入,以便用户可以随时更改功能。

我曾尝试使用线程包,但没有成功...也许有一种更简单的方法,但是我对编码是完全陌生的,因此我一无所知。欢迎提出建议!

这是我的代码,

import pyfirmata
import threading
import time

board = pyfirmata.Arduino('/dev/cu.usbmodem14101')

def flash():
    for i in range(1000):
        board.digital[13].write(1)
        time.sleep(1)
        board.digital[13].write(0)
        time.sleep(1)

def stop():
    board.digital[13].write(0)


while True:
    runMode = input("Run or Stop? ")

    if runMode == "Run":
        x = threading.Thread(target=flash(), args=(1,))
        x.start()
        # x.join()

    elif runMode == "Stop":
        x = threading.Thread(target=stop(), args=(1,))
        x.start()
        #x.join()
python python-3.x concurrency python-multithreading
3个回答
0
投票

如果您只是想杀死线程,可以使用多线程处理一个multiprocessing.Process可以p.terminate()

p = Process(target=flash, args=(,))
while True:
    runMode = input("Run or Stop? ")
    if runMode == "Run":
        p.start()
    elif runMode == "Stop":
        p.terminate()

但是不建议您仅仅杀死线程,因为如果该进程正在处理关键资源或依赖于其他线程,则可能导致错误,请参见此处以获得更好的解释Is there any way to kill a Thread?

这里描述的更好的选择是使用标志来处理您的闪烁,它们允许线程之间的简单通信

from threading import Event

e = event()

def check_for_stop(e):
    while not e.isSet():
         flash()
    print("Flashing Ended")

while True:
    runMode = input("Run or Stop? ")

    if runMode == "Run":
        x = threading.Thread(target=check_for_stop, args=(e,))
        x.start()
        # x.join()

    elif runMode == "Stop":
        e.set() #set flag true
        e.clear() #reset flag

这里是有关事件对象https://docs.python.org/2.0/lib/event-objects.html的更多信息的文档”>

我还没有测试这段代码只是一个示例,如果不能立即使用,请您道歉

编辑:只要再次查看您的函数,您就想在闪烁期间检查标志,这就是我的错误道歉,因此您的Flash函数看起来像

def flash():
    while e.isSet():
        board.digital[13].write(1)
        time.sleep(1)
        board.digital[13].write(0)
        time.sleep(1)

您将像以前一样将其传递给线程

x = threading.Thread(target=flash(), args=(1,))
x.start()

0
投票

您在代码中出错。


0
投票

您可以通过创建自己的Thread子类,例如下面的Flasher类,以面向对象的方式进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.