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

长期运行Python主程序并行网络检查实现及欧盟隐私DNS推荐

问题解答

一、欧盟境内符合要求的DNS服务器

以下是欧盟境内、承诺不收集个人数据且运行稳定的DNS服务:

  • Quad9 欧盟节点:9.9.9.10(位于荷兰阿姆斯特丹),公益性质的安全DNS,明确执行无日志政策,宕机概率极低。
  • DNS.WATCH:84.200.69.80(位于瑞典),长期提供无日志DNS服务,运行稳定,属于欧盟境内节点。
  • CleanBrowsing 德国节点:185.228.168.9(位于德国),严格遵守隐私政策,不收集用户访问数据,可选普通无过滤版本。

你可以将现有代码中的("1.1.1.1", 80)替换为上述任意节点的IP和端口(80或53均可,用80端口可避免部分网络对DNS端口的限制)。

二、实现辅助程序暂停主程序的方案

可以通过多线程+事件信号的方式实现:用独立线程运行网络检查逻辑,通过threading.Event控制主程序的暂停与恢复,无需主动"中断"主程序,而是让主程序在网络断开时进入等待状态。

完整代码示例

import socket
import threading
import time

def check_internet_connection() -> bool:
    """检查网络连接,使用欧盟境内隐私友好的DNS服务器"""
    try:
        # 使用Quad9欧盟节点(荷兰阿姆斯特丹)
        socket.create_connection(("9.9.9.10", 80), timeout=5)
        return True
    except OSError:
        return False

def network_monitor(stop_event: threading.Event, resume_event: threading.Event):
    """独立线程运行的网络监控逻辑"""
    while not stop_event.is_set():
        is_connected = check_internet_connection()
        if is_connected and not resume_event.is_set():
            resume_event.set()
            print("网络恢复,主程序继续运行")
        elif not is_connected and resume_event.is_set():
            resume_event.clear()
            print("网络断开,主程序暂停")
        time.sleep(10)  # 每10秒检查一次,可根据需求调整间隔

def main_program(resume_event: threading.Event):
    """长期运行的主程序逻辑"""
    while True:
        # 等待网络恢复(网络正常时resume_event处于设置状态,直接跳过等待)
        resume_event.wait()
        
        # 这里替换为你的主程序联网逻辑
        print("主程序执行联网任务...")
        try:
            # 示例:模拟联网操作
            # socket.create_connection(("your-target-server.com", 80), timeout=10)
            time.sleep(2)  # 模拟任务耗时
        except Exception as e:
            print(f"主程序任务出错: {e}")

if __name__ == "__main__":
    # 用于停止监控线程的信号
    stop_monitor = threading.Event()
    # 用于控制主程序暂停/恢复的信号
    resume_main = threading.Event()

    # 初始网络状态检查
    if check_internet_connection():
        resume_main.set()
    else:
        print("初始网络断开,主程序等待连接...")

    # 启动监控线程(守护线程,主程序退出时自动终止)
    monitor_thread = threading.Thread(
        target=network_monitor,
        args=(stop_monitor, resume_main),
        daemon=True
    )
    monitor_thread.start()

    try:
        main_program(resume_main)
    except KeyboardInterrupt:
        stop_monitor.set()
        print("程序已退出")

核心逻辑说明

  1. 线程隔离:网络监控逻辑在独立线程中运行,不阻塞主程序的正常执行。
  2. 事件控制:resume_event作为主程序的运行许可:
    • 网络正常时,事件处于"设置"状态,主程序正常执行。
    • 网络断开时,事件被"清除",主程序在resume_event.wait()处进入阻塞等待,直到网络恢复、事件重新被设置。
  3. 低资源消耗:监控线程每隔固定时间检查一次网络,避免频繁检测占用资源。

内容的提问来源于stack exchange,提问作者user20874428

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:07:47