python - 垃圾收集如何处理多个正在运行的进程/线程?

标签 python python-2.7 garbage-collection multiprocessing

我有一个类似服务器的 Python 程序,它接收数据包,并根据数据包的类型处理它们。为此,我使用 multiprocessing 模块生成了多个进程。我注意到垃圾收集会在操作过程中造成一些延迟,并且数据包不会在所需的时间范围内得到处理。我知道如何禁用垃圾收集:

import gc
gc.disable()

但是我的问题是,当涉及多个进程或线程时,Python 究竟如何处理垃圾回收?进程或线程的垃圾收集之间是否存在差异?我需要改变每个进程/线程的垃圾收集吗?或者父进程/线程中垃圾收集的单一变化是否也负责处理所有子进程/线程?

我目前使用的是 Python 2.7,但我很想知道 Python 2 和 Python 3 是否相同。

最佳答案

一个进程可以有多个线程。 垃圾收集在一个进程中工作。

在支持 fork 的系统上:如果您在一个进程中禁用垃圾收集然后将其 fork(= 创建该进程的副本),那么副本中的 GC 也应该被禁用。

如果创建的新进程不是副本,那么它们有自己的垃圾收集配置。默认情况下,他们的 GC 应该是打开的。

但是有很多库都有 Process 类。我不知道他们在做什么。如果您使用 os 生成一个新进程(不是副本),那么它应该在 GC 开启的情况下运行。

一个进程的 GC 的配置对另一个进程的 GC 的配置没有影响。进程是保护代码不受彼此影响的边界。因此,一个进程中的任何内容都无法轻易进入另一个进程。

关于python - 垃圾收集如何处理多个正在运行的进程/线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272943/

相关文章:

C# 内存分配、GC、死对象不匹配的内存诊断

python - 为什么 select 语句没有从数据库表中选择所有行?每次都会忽略第一个条目

python - 使用 urlopen 我可以获取页面的 html,但缺少一个关键部分

python - 如何使下面的代码工作

python - 在 Pygame 中绘制箭头

python - 垃圾收集-mark + sweep是否必须为整体/原子

c# - 在处理时清空托管资源

python - 当我使用 dir([user-defined object]) 时,为什么它还会返回对象父类的命名空间中的名称?

Python - 使用来自不同 .csv 文件的行搜索 .csv 文件

python - 我如何打破2个循环? (Python)