You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:24:30