““ Yield”制动一个while循环在线程中运行

问题描述 投票:-2回答:1

我有两个独立的功能,都使用套接字与服务器通信。一个仅用于保持收集活动状态,而另一个收集收集的数据。

例如

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()

但是,当我将data_colector()中的print更改为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()thread甚至没有凝视。

这是正常行为,如何使data_colector()yield变量?

python multithreading yield
1个回答
0
投票

Yield是与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
© www.soinside.com 2019 - 2024. All rights reserved.