Получение данных из другого файла из потока python - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу запустить поток для получения данных, сохранить эти данные в переменной, а затем обработать эту переменную с помощью Flask (веб-страница). Сейчас веб-сервер обслуживает переменную, содержащую только то, что я добавил с помощью create_sock, а не то, что было добавлено с update_data.

sock.py (помещает данные в переменную)

import socket
import sys
from threading import Thread
import time
import json

import config
import sock_data


class ServerThread(Thread):

    def __init__(self, serv_id, host, port):
        Thread.__init__(self)
        self.serv_id = serv_id
        self.host = host
        self.port = port

    def run(self):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
            sock.connect((self.host, self.port))
            while True:
                sock.sendall(b'info')
                data = sock.recv(1024)
                if data:
                    new_data = data.decode('utf-8')
                    new_data = json.loads(new_data)
                    sock_data.update_data(self.serv_id, new_data)
                time.sleep(config.NEW_DATA_DELAY)

sock_data.py (управляет переменной с помощью удобных методов)

sock_list = []

def create_sock(name):
    sock_id = len(sock_list)
    sock_list.append({
        "sock_id": sock_id,
        "name": name,
    })
    return sock_id

def update_data(sock_id, data):
    sock_list[sock_id].update(data)
    print(sock_list)

def get_all():
    print(sock_list)
    return sock_list

webserver.py (служит переменной как json в сети)

from flask import Flask, jsonify
import threading

import sock

app = Flask(__name__)


@app.route("/")
def route_test():
    return "Working"

@app.route("/getservers")
def route_servers():
    return jsonify(sock_data.get_all())

1 Ответ

1 голос
/ 26 февраля 2020

Инициализируйте поток внутри webserver.py.

server_thread = ServerThread()
server_thread.start()

Об этом следует позаботиться: сначала используется sock_list в качестве списка, а затем в качестве диктанта. Ваша функция update_data, вероятно, вызовет KeyError при вызове внутри ServerThread. Кроме того, вы должны быть осторожны с условиями гонки, которые могут возникнуть, если одновременно вызываться create_sock и update_data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...