Python 通過定時器,停止無線迴圈的執行緒

2021-10-08 03:54:27 字數 2216 閱讀 2883

有乙個執行緒,它執行的是乙個無線迴圈的任務

當這個執行緒長時間沒有收到外界的訊息的時候,自動停止。

這個時候我們需要乙個定時器自動的去計時

比如 超過5秒沒有收到訊息,則停止。

如果5秒內收到了訊息,這個5秒需要被重置,重新計算乙個5秒。

import threading

import queue

import time

# 定時器觸發時,執行的函式,停止程序

def stop_server(server):

server.stop()

print("timer -> stop the server ")

# 例項化定時器

def newtimer(server):

timer = threading.timer(5,stop_server,(server,))

return timer

# 重置定時器,如果我們輸入了內容,則定時器會執行cancel() 和 start(),定時器時間被重置了

def send_msg():

global msg_queue

while true:

msg = input("請輸入要傳送的訊息\n")

if msg == "break":

break

msg_queue.put(msg)

print("success send message ->",msg)

# 我們的執行緒

class server:

def __init__(self):

self._running = true

def stop(self):

# (這裡停止程序,python沒有對應的api,我們通過迴圈,根據判斷條件決定是否退出)

print("server stop")

self._running = false

def run(self,name):

global msg_queue,server,timer

print(name,"is running ....")

while self._running: # 迴圈的判斷條件

try:

msg = msg_queue.get(timeout=5)

print("success receive messages ->",msg)

# ------- 接收到訊息後,重置定時器 ------------------

timer.cancel()

timer = newtimer(server) # 取消後定時器就不能用了,必須再次例項化

timer.start()

print("timer 定時器被重置")

except queue.empty as e:

print("queue get timeout,請輸入break退出")

if __name__ == "__main__":

# ---------------- 建立乙個 傳送和接受訊息的佇列 ------------------

msg_queue = queue.queue(5)

# ---------------- 啟動執行緒-------------------------------------

server = server()

task = threading.thread(target=server.run, args=("msg-server",))

task.start()

# ---------------- 啟動定時器 ---------------------------------

# timer = threading.timer(5,stop_server,(server,))

# timer.start()

timer = newtimer(server)

timer.start()

# ---------------- 向訊息佇列中傳送訊息---------------------------------

send_msg()

# ---------------- 阻塞 ----------------

# 其實不用這一步也可以,畢竟我們的listen_timer本身就阻塞住了,主線程不會退出。

task.join()

Android 定時器的實現和停止

一 採用handle與執行緒的sleep long 方法 1.定義乙個handler類,用於處理接受到的message handler handler new handler 2.新建乙個實現runnable介面的執行緒類,如下 public class mythread implements ru...

Python的定時器

在實際應用中,我們經常需要使用定時器去觸發一些事件。p ython中通過執行緒實現定時器timer,其使用非常簡單。看示例 importthreading deffun timer print hello timer timer threading.timer 1 fun timer timer.s...

python 迴圈定時器

有時候需要迴圈執行某個任務,最簡單的就是用thread.timer.谷歌了一下,發現大家竟然用sleep 來實現迴圈,也不知道誰想的這個方法,竟然很少有人想到join一下,很奇怪。coding utf 8 created on 2016年4月25日 author 55haitao import th...