Swift RunLoop在Python threading子线程中调用立即返回问题
Python子线程调用Swift RunLoop立即退出问题
需求背景
我正在编写独立Swift库,用于监听NSUserDefaults值变化并回调Python端函数。实现该能力需要在Swift代码中运行事件循环支撑观察者逻辑执行,在触发条件满足时调用回调函数。
Swift原生提供RunLoop实现事件循环能力,在Python主线程中通过ctypes调用时可正常运行。但为了避免阻塞Python主程序(这也是使用回调的核心目的),我将调用逻辑封装到threading模块创建的子线程中时,RunLoop会立即返回,完全无法正常工作。
最小复现示例
示例仅包含核心循环逻辑与Python端调用代码,无额外业务逻辑:
- Swift实现文件
runLoop.swift
import Foundation @_silgen_name("run") public func run() -> Void { // 支持从Python端按Ctrl-C中断程序 let signalCallback: sig_t = { signal in exit(signal) } signal(SIGINT, signalCallback) RunLoop.current.run() }
编译命令:swiftc -emit-library -o ./loop runLoop.swift
- Python调用文件
pyrun.py
import ctypes import threading loop = ctypes.cdll.LoadLibrary('./loop') loop.run.argtypes = None loop.run.restype = ctypes.c_void_p # loop.run() # 主线程直接调用可正常运行 t = threading.Thread(target=loop.run) t.start() t.join()
运行命令:python3 pyrun.py
复现现象
- 按上述示例直接运行时,Swift端的RunLoop会立即退出返回
- 取消注释主线程直接调用
loop.run()的代码,RunLoop可正常持续运行 - 使用
multiprocessing模块替代threading创建子进程调用时,Swift的RunLoop可正常工作,说明该问题与threading模块创建线程的特定机制有关 - 使用Objective-C调用
[[NSRunLoop currentRunLoop] run];时会出现完全相同的问题
内容的提问来源于stack exchange,提问作者asottile
相关产品推荐
相关产品推荐

