«Урожай», тормозящий цикл while, запускается в потоке - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть две отдельные функции, обе используют сокет для связи с сервером. Один служит только для поддержания живого сбора, а другой собирает полученные данные.

Например

def keep_connection():
    while True:
       #keeps connection by sending signal to the server
       time.sleep(30)

def data_colector():
    while True:
        out = str(s.recv(auth_file.SocketConnectPort)
        var_index = out.find('269=0')
        var_1 = (((out[var_index + 13:var_index + 20]).replace('.', '')).replace('\\', '')).replace('x', '')
        ...
        print(var_1, var_2, var_3)

Я запускаю их стенд одновременно с Threading и все работаетотлично,

t_1 = threading.Thread(target=data_colector)
t_2 = threading.Thread(target=keep_connection)
t_1.start()
t_2.start()

пока я меняю print в data_colector () на yield , он вообще не работает.

def data_colector():
    print('confirm thread started')
    while True:
        #collects data received and converts it into few variables
        yield var_1, var_2, var_3

Ошибка не возвращается, и похоже, что поток работает data_colector () даже не смотрит.

Это нормальное поведение, как я могу сделать data_colector () выход переменных?

1 Ответ

0 голосов
/ 11 ноября 2019

Выход - это ключевое слово, которое используется как return, за исключением того, что функция вернет генератор.

def data_colector():
    print('confirm thread started')
    # collects data received and converts it into few variables
    for (var_1, var_2, var_3) in some_object:
        yield var_1, var_2, var_3

for a, b, c in data_colector()
    print(a, b, c)

Таким образом, вы должны использовать цикл для вызова генератора. У меня есть простой пример:

def func():
    for i in range(3):
        yield i
a = func()
for i in a:
    print(i)

вывод:

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