在多线程Python进程中,我有许多非守护进程线程,这是指即使在主线程退出/停止后仍使主进程保持活动状态的线程。
我非守护线程持有弱引用在主线程对某些对象,但是当主线程结束(控制脱落的文件的底部),这些对象就不会出现被垃圾收集,我的弱引用finaliser回调别开火。
我期望主线程被垃圾回收是错误的吗?我本来希望将线程局部变量释放(即收集垃圾)...
我错过了什么?
配套材料
pprint.pprint( threading.enumerate() )显示主线程的输出已停止,而其他士兵继续使用。
[<_MainThread(MainThread, stopped 139664516818688)>,
<LDQServer(testLogIOWorkerThread, started 139664479889152)>,
<_Timer(Thread-18, started 139663928870656)>,
<LDQServer(debugLogIOWorkerThread, started 139664437925632)>,
<_Timer(Thread-17, started 139664463103744)>,
<_Timer(Thread-19, started 139663937263360)>,
<LDQServer(testLogIOWorkerThread, started 139664471496448)>,
<LDQServer(debugLogIOWorkerThread, started 139664446318336)>]
而且由于总是有人询问用例...
我的网络服务有时会错过实时期限(这在最坏的情况下会导致整个系统故障)。事实证明这是因为(重要的)DEBUG数据的日志记录会在文件系统发脾气时阻塞。因此,我正在尝试改造许多已建立的专用日志记录库,以将阻塞的I / O推迟到工作线程中。
可悲的是,已建立的使用模式是混合记录并行事务的短期日志记录通道和从未明确关闭的长期模块作用域通道的混合。
因此,我创建了一个装饰器,该装饰器将对方法的调用推迟到工作线程中。worker线程是非守护程序,以确保所有(缓慢的)阻塞I / O在解释器退出之前完成,并保持对客户端的弱引用(方法调用入队)。当客户端进行垃圾回收时,弱引用的回调将触发,并且工作线程知道不再有更多的工作排队,因此将在下一个方便时退出。
在一个重要的用例中,这似乎可以正常工作:在日志记录通道位于主线程中时。当主线程停止/退出时,日志记录通道尚未完成,因此,我的(非守护程序)工作线程始终保持整个进程运行。
慕妹3242003
相关分类