Python &引用;“收益率”;制动while循环磨合线程

Python &引用;“收益率”;制动while循环磨合线程,python,multithreading,yield,Python,Multithreading,Yield,我有两个独立的函数,都使用套接字与服务器通信。一个仅用于保持收集活动,另一个用于收集接收到的数据 e、 g 我在穿线的同时运行它们,一切正常 t_1 = threading.Thread(target=data_colector) t_2 = threading.Thread(target=keep_connection) t_1.start() t_2.start() 然而,当我将print in data_collector()更改为yield时,它根本不起作用 def data_cole

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

e、 g

我在穿线的同时运行它们,一切正常

t_1 = threading.Thread(target=data_colector)
t_2 = threading.Thread(target=keep_connection)
t_1.start()
t_2.start()
然而,当我将print in data_collector()更改为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_collector()的线程似乎没有启动


这是正常行为吗?如何使data_collector()产生变量?

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

您能否显示使用
数据收集器()的代码?如果只调用一次,则只会得到1组变量,因为yield就是这样做的。稍微改写一下@Loocid所说的,您的
while
循环会产生无限次,但总是产生相同的值。你认为收益率是什么?也许这就是问题所在。您不需要显示完整的代码,但需要显示足够的代码来重现问题。@WiktorKisielewski了解yield的作用,我认为您误解了它的工作原理。将代码更改为使用
yield
会使
data\u collector
函数返回一个生成器,而不是任何实际值。函数中的实际代码永远不会被调用,除非您在生成器上迭代返回的函数。因为我们只看到函数,而不知道如何使用返回的生成器,所以我们无法确定出了什么问题。
0
1
2