【问题标题】:"Yield" braking a while loop run in thread“屈服”制动线程中运行的while循环
【发布时间】:2020-03-06 19:37:06
【问题描述】:

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

例如

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()线程 甚至没有盯着看。

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

【问题讨论】:

  • 你能显示你使用data_colector()的代码吗?如果你只调用一次,你只会得到一组变量,因为这就是 yield 所做的。
  • 稍微改写@Loocid 所说的话,您的while 循环产生无限次,但它总是产生相同的值。你认为产量有什么作用?也许这就是问题所在。
  • 你不需要展示完整的代码,但你需要展示足够的东西来重现问题。
  • @WiktorKisielewski 了解一下 yield 的作用,我认为您误解了它的工作原理。
  • 将代码更改为使用yield 会使data_colector 函数返回一个生成器,而不是任何实际值。函数中的实际代码永远不会被调用,除非您迭代生成器,函数返回。由于我们只看到函数而不是您如何使用返回的生成器,因此我们不确定出了什么问题。

标签: python multithreading yield


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 2021-09-14
    • 1970-01-01
    • 2021-10-26
    • 2010-09-28
    • 2015-06-14
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多