是否可以在不设置/检查任何标志/信号量/等的情况下终止正在运行的线程?
想想我正在调用它的副作用的函数,而不是返回值(比如打印到屏幕,更新GUI,打印到文件等).
def fun_with_side_effects(x):
...side effects...
return y
Run Code Online (Sandbox Code Playgroud)
现在,是Pythonic使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
Run Code Online (Sandbox Code Playgroud)
请注意,我不会将列表保存在任何位置
或者我应该像这样调用这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
在这个问题上,我和一位辩论者提出了争论
for t in threads:
t.join()
Run Code Online (Sandbox Code Playgroud)
会好过的
[t.join() for t in threads]
Run Code Online (Sandbox Code Playgroud)
抛开"滥用理解"的问题 - 我倾向于同意,但我想要这样一个单行:如何(in-)效率是我的版本(第二个)真的吗?Python总是/在我的情况下实现列表推导还是在内部使用生成器?
会map(lambda t: t.join(), threads)
更高效吗?或者是否有另一种方法将函数应用于列表中的每个元素threads
?
我需要我的主程序在某个时候什么都不做 - 永远(有些线程更早开始做一些工作)。
我想知道这样做的pythonic方法是什么。我特别想避免在这种虚无上丢失 CPU 周期。
我的直接猜测是time.sleep(100000)
哪里100000
足够大,适合我的程序的生命周期。它有效,但在美学上并不令人愉快。我检查了运行这个的 python 会话的 CPU 负载:不可测量(接近于零)。
我也试过
while True:
pass
Run Code Online (Sandbox Code Playgroud)
它看起来更好,但对 CPU 的影响是巨大的(~25%)。