可以不加入我的任何 Greenlets 吗?
Is It Okay Not to Join Any of My Greenlets?
我们在长期 Python 进程中使用 gevent
,随着时间的推移,我们产生了成千上万的 Greenlets。
我们不加入任何这些Greenlet;我们只是产生并忘记。 (Greenlet 任务本身是短暂的,确实会退出。)这样可以吗? 我们不加入 Greenlets 是否会泄露任何资源?
我没有使用过 gevent,所以请对此持保留态度。对于一般的线程,对 join 的所有调用都会阻塞,直到线程完成或死亡,这就是 gevent docs 中提到的全部内容。它通常只用于同步线程,而不是用于清理,所以你应该没问题。
从某种意义上说,您并没有泄漏资源,因为当 greenlet 死机时,所有使用的内存都会被正确清理(并且垃圾收集发生,这是自动的)。所以我不会担心那个。
当然,您对架构的描述并没有使它看起来非常健壮。因此,虽然您本身并没有泄漏内存,但如果您真的启动了太多的 greenlet,您可能会发现您的主 greenlet 很少执行。换句话说,每当它屈服于集线器(通过睡眠或任何其他阻塞调用)时,您可能会发现在主 greenlet 恢复生机之前调用并执行了数千个 greenlet。
还要注意在 hub 和 greenlet 之间来回切换的开销。
我们在长期 Python 进程中使用 gevent
,随着时间的推移,我们产生了成千上万的 Greenlets。
我们不加入任何这些Greenlet;我们只是产生并忘记。 (Greenlet 任务本身是短暂的,确实会退出。)这样可以吗? 我们不加入 Greenlets 是否会泄露任何资源?
我没有使用过 gevent,所以请对此持保留态度。对于一般的线程,对 join 的所有调用都会阻塞,直到线程完成或死亡,这就是 gevent docs 中提到的全部内容。它通常只用于同步线程,而不是用于清理,所以你应该没问题。
从某种意义上说,您并没有泄漏资源,因为当 greenlet 死机时,所有使用的内存都会被正确清理(并且垃圾收集发生,这是自动的)。所以我不会担心那个。
当然,您对架构的描述并没有使它看起来非常健壮。因此,虽然您本身并没有泄漏内存,但如果您真的启动了太多的 greenlet,您可能会发现您的主 greenlet 很少执行。换句话说,每当它屈服于集线器(通过睡眠或任何其他阻塞调用)时,您可能会发现在主 greenlet 恢复生机之前调用并执行了数千个 greenlet。
还要注意在 hub 和 greenlet 之间来回切换的开销。