(Python)用原始输入停止线程?

2024-09-24 06:26:03 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑9/15/16:在我最初的代码中(仍然张贴在下面),我试图将.join()与函数一起使用,这是一个愚蠢的错误,因为它只能用于thread对象。我正在努力 (1) 连续运行获取数据并将其保存到文件中的线程 (2) 有第二个线程或合并队列,一旦用户输入一个标志(即“停止”),它将停止程序。它不会中断数据收集/保存线程。在

我需要多线程的帮助。我尝试运行两个线程,一个处理数据,另一个检查是否有标志来停止程序。在

我通过反复试验了解到,如果计算机没有爆炸,我就不能中断while循环。另外,我已经放弃了GUI代码,因为它使我的代码在mulithreading中过于复杂。在

我要做的是运行一个线程,从Arduino收集数据,将其保存到一个文件中,然后重复这个过程。第二个线程将扫描一个标志——它可以是一个原始的输入?我想不出用户还能做什么来停止数据采集程序。在

我非常感谢在这方面的任何帮助。以下是我的代码(如您所见,大部分是伪代码):

#threading
import thread
import time

global flag

def monitorData():
    print "running!"
    time.sleep(5)

def stopdata(flag ):

    flag = raw_input("enter stop: ")

    if flag == "stop":
        monitorData.join()

flag = "start"

thread.start_new_thread( monitorData,())
thread.start_new_thread( stopdata,(flag,))

当我尝试在空闲状态下输入“stop”时,我得到的错误是这个。在

由启动的线程中出现未处理的异常 回溯(最近一次呼叫): stopdata中第16行的文件“c:\users\otangu~1\appdata\local\temp\IDLE\u rtmp_h_frd5” AttributeError:“function”对象没有属性“join”

再一次,我真的很感谢你的帮助,到目前为止我已经自学了Python,这是我遇到的第一堵巨大的墙。在


Tags: 文件数据对象代码程序标志错误线程
3条回答

这是不可能的。线程函数必须完成。你不能从外面加入。在

你在找这样的东西:

from threading import Thread
from time import sleep

# "volatile" global shared by threads
active = True

def get_data():
    while active:
        print "working!"
        sleep(3)

def wait_on_user():
    global active
    raw_input("press enter to stop")
    active = False        

th1 = Thread(target=get_data)
th1.start()
th2 = Thread(target=wait_on_user)
th2.start()

th1.join()
th2.join()

您在代码中犯了一些明显的错误和一些不太明显的错误。首先,join是在线程对象而不是函数上调用的。类似地,join不会杀死线程,它会等待线程完成。线程在没有更多代码可执行时结束。如果你想让一个线程在某个标志被设置之前一直运行,通常在你的线程中包含一个循环,它每隔一秒左右检查一次标志(这取决于你需要的计时有多精确)。在

此外,螺纹模块优于低杆螺纹模块。后者已在Python3中移除。在

您看到的错误是对函数调用join的结果。您需要对thread对象调用join。您没有捕获对线程的引用,因此您无论如何也无法调用join。你应该这样。在

th1 = thread.start_new_thread( monitorData,())

# later
th1.join()

对于解决方案,可以使用Queue在线程之间进行通信。队列用于向worker线程发送一个quit消息,如果worker在一秒钟内没有从队列中获取任何信息,它将运行从arduino收集数据的代码。在

^{pr2}$

它可能比您希望的代码多了一点,并且必须检测到队列是空的(有一个异常)有点难看,但是这不依赖于任何全局变量,并且总是会立即退出。基于sleep的解决方案则不是这样,它需要等待任何当前对sleep的调用完成,然后才能继续执行。在

正如其他人所指出的,您应该真正使用threading,而不是旧的thread模块,而且我建议您使用python3而不是python2来学习。在

相关问题 更多 >