Python从无限循环线程返回值

时间:2018-01-24 18:50:26

标签: python python-3.x while-loop infinite-loop python-multithreading

因此,对于我的程序,我需要检查本地网络上的客户端,该客户端正在运行Flask服务器。此Flask服务器返回一个能够更改的号码。

现在要检索该值,我使用请求库和BeautifulSoup。
我想在我的脚本的另一部分中使用检索到的值(同时连续检查另一个客户端)。为此,我想我可以使用线程模块。
然而问题是,线程只有在完成循环时返回它的值,但循环必须是无限的。

这是我到目前为止所得到的:

import threading
import requests
from bs4 import BeautifulSoup

def checkClient():
    while True:
        page = requests.get('http://192.168.1.25/8080')
        soup = BeautifulSoup(page.text, 'html.parser')
        value = soup.find('div', class_='valueDecibel')
        print(value)

t1 = threading.Thread(target=checkClient, name=checkClient)
t1.start()


有谁知道如何将打印值返回到另一个函数?当然,您可以使用某种值替换requests.get url,其中值会发生很大变化。

1 个答案:

答案 0 :(得分:3)

你需要一个Queue和一些正在侦听的队列

import queue
import threading
import requests
from bs4 import BeautifulSoup

def checkClient(q):
    while True:
        page = requests.get('http://192.168.1.25/8080')
        soup = BeautifulSoup(page.text, 'html.parser')
        value = soup.find('div', class_='valueDecibel')
        q.put(value)

q = queue.Queue()
t1 = threading.Thread(target=checkClient, name=checkClient, args=(q,))
t1.start()

while True:
    value = q.get()
    print(value)

Queue是线程安全的,允许来回传递值。在你的情况下,他们只是从线程发送到接收者。

请参阅:https://docs.python.org/3/library/queue.html