【发布时间】: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