Bitnodes如何维护上万个比特币节点长连接:ping.py与gevent绿色线程并发模型深度剖析
Bitnodes如何维护上万个比特币节点长连接ping.py与gevent绿色线程并发模型深度剖析【免费下载链接】bitnodesBitnodes estimates the size of the Bitcoin peer-to-peer network by finding all of its reachable and unreachable nodes.项目地址: https://gitcode.com/gh_mirrors/bi/bitnodesBitnodes 是一个比特币节点网络规模估算工具它通过递归发送 getaddr 消息找到全网所有可达节点并长期保持与每个节点的一条长连接来持续测量网络大小。本文带你完整拆解它的核心进程 ping.py一个单进程如何只靠 gevent 绿色线程同时维系上万条 TCP 长连接而不崩溃。读完你会掌握一套可复用的 IO 密集型高并发架构思路。一、先搞懂 Bitnodes 在做什么Bitnodes 由两部分组成爬虫子crawl.py从种子节点出发做广度优先搜索周期性产出一份可达节点快照JSON 文件长连接维护者ping.py本文主角。它读取最新快照与快照中每一个可达节点建立并永久保持一条 TCP 连接持续发送 ping、记录 RTT往返时延、刷新版本信息最终把这些数据写入 Redis供 export.py 导出网络快照。生产环境的编排脚本 start.sh 一目了然1 个 master 15 个 slave 进程跑 ping.py每个进程内部再开 2000 个绿色线程——上万条长连接就是这么撑起来的。二、为什么用 gevent 绿色线程而不是多线程维护长连接是典型的IO 密集型任务每个线程 99% 的时间都在等网络数据CPU 几乎空闲。如果每个连接开一个操作系统线程上万个线程意味着几十 GB 内存和不可接受的上下文切换开销。Bitnodes 的答案是gevent 绿色线程greenlet协程级别的用户态并发单线程内数千个协程共享解释器切上下文只需保存几个寄存器开销比系统线程低几个数量级。整个项目在 ping.py 开头两行就完成了并发化改造monkey.patch_all() # 把 socket 等阻塞 API 替换为可协作调度版本 pool gevent.pool.Pool(CONF[workers]) # workers 默认 2000monkey.patch_all()是关键一步补丁之后socket.recv()这类原本卡住整个进程的调用会在数据未就绪时主动挂起当前协程让出 CPU 给其他协程——2000 个连接协程因此可以共享一个真正的 OS 线程轮流跑。协议层 protocol.py 的Connection.get_messages()里也显式调用gevent.sleep(0)让出调度避免某个协程长时间霸占 CPU。三、整体并发模型cron 调度器 连接池 连接管理器ping.py 的架构可以概括为三个角色┌────────────┐ 每10秒 ┌──────────────────────────────┐ │ cron 协程 │ ────────▶ │ gevent.pool.Pool(2000) │ │ (每进程1个) │ 按需spawn│ ┌─────────┐ ┌─────────┐ ... │ └────────────┘ │ │ConnManager│ │ConnManager│ │ │ │ Keepalive│ │ Keepalive│ │ └──────────────────────────────┘ ↕ Redis3.1 cron 协程全局心跳cron 是每 10 秒cron_delay唤醒一次的主循环master 角色额外负责换新快照检测到 crawl_dir 下出现新的爬取 JSON 时把所有未持连的节点灌入 Redis 的reachable集合并发布 pub/sub 信号通知其他进程。随后所有进程做同一件事统计reachable里还有多少节点spawn 等量的连接协程。细节里藏着一个精巧的限流设计——把新建连接均匀摊到 5 分钟窗口内backoff_time 300 * random / connections避免快照更新瞬间几千个节点同时发起握手把自己和对方都打爆。3.2 ConnectionManager建立一条连接每个被 spawn 出来的协程执行 ConnectionManager.connect()流程是取任务从 Redis 集合reachable中spop弹出一个节点原子操作天然去重多进程多协程抢任务不会冲突准入检查is_allowed()先按CIDR 前缀限流同一网段最多连 N 个节点避免把连接全堆到一家机房再对open:ip-port键执行SET NX——如果已有别的协程在连这个节点直接放弃握手通过 protocol.py 的Connection类完成 TCP 连接 version 消息握手.onion 节点自动走 Tor 代理移交握手成功后把连接交给 Keepalive 协程长期维护直到连接死亡才回收 Redis 中的占位键。四、Keepalive长连接的心跳引擎Keepalive.keepalive() 是每连接一个的驻留协程死循环里做三件事发 ping默认每 60 秒区间 60~600 秒发一次带随机 nonce 的 ping并把时间戳压入 Redis 的ping:ip-port:nonce列表——等对端回 pong 后就能算出这条连接的 RTT刷版本每天从 Redis 读一次最新的 version 数据节点升级客户端后opendata集合里的记录会自动更新排空缓冲区sink()持续读取对端消息防止 TCP 窗口被撑死同时顺带缓存对方发来的 block inv 消息写入binv:*键。任何一个环节抛出socket.error/ProtocolError协程就清理 Redis 状态并退出——连接死了cron 下一轮会看到reachable里的缺口如果快照还认为它可达自动重连。没有集中式的连接表状态全部落在 Redis 里这就是 16 个 ping 进程能协同管理同一批节点的原因。五、Redis绿色线程之间的共享内存Redis 键类型作用reachableSet待建连节点池协程用spop抢任务opendataSorted Set当前所有存活连接的元数据版本、UA、服务位score 是心跳时间戳master 每轮清理 20 分钟前的僵尸条目open:ip-portString (NX)连接占位锁防止多进程重复连同一节点ping:cidr:网段/前缀Counter同网段连接数限流计数ping:ip-port:nonceList TTLping 时间戳用于计算 RTT多协程/多进程的安全全靠 Redis 的原子原语SPOP、SET NX、INCR项目里几乎看不到一把锁。六、关键参数速查conf/ping.conf.default想调优时conf/ping.conf.default 里这几个参数最值得注意workers 2000单进程绿色线程上限即单进程最大并发长连接数socket_timeout 30/open_timeout 5读超时与建连超时决定死连接的发现速度cron_delay 10调度心跳间隔version_delay 86400每天刷新一次节点版本nodes_per_ipv6_prefix 1IPv6 /64 前缀只保留 1 条连接——同一台机器在 IPv6 下可能换出多个地址这个参数是去重利器。七、总结这套并发模型好在哪单进程扛万级连接gevent 把等 IO变成零成本挂起2000 个协程 ≈ 几 MB 内存无锁分布式任务队列、去重、限流、状态全部下沉到 Redis 原子操作16 个进程水平扩展互不干扰自愈式生命周期cron 周期性对比应有连接数与空闲槽位补差即可节点掉线自动被下一轮补上平滑限流5 分钟窗口摊平建连风暴 CIDR 前缀配额对全网节点足够友好。如果你想动手体验项目里还有完整的单测可以对照阅读比如 tests/test_ping.py 用 MagicMock 精确断言了spop → INCR → SET NX → ZADD → ZREM → DEL的完整 Redis 调用序列是理解这套并发状态机的最佳说明书。【免费下载链接】bitnodesBitnodes estimates the size of the Bitcoin peer-to-peer network by finding all of its reachable and unreachable nodes.项目地址: https://gitcode.com/gh_mirrors/bi/bitnodes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

图增强联想记忆GAAMA:解决AI智能体记忆碎片化难题

图增强联想记忆GAAMA:解决AI智能体记忆碎片化难题

1. 项目概述:当智能体需要“记忆”时,我们谈什么?如果你最近在折腾AI智能体(Agents),尤其是那些需要处理复杂任务、进行多轮对话或决策的,大概率会遇到一个核心痛点:记忆问题。智能体…

2026/8/24 9:48:11 阅读更多 →
GAAMA:图谱增强记忆如何革新AI智能体的复杂任务规划与推理

GAAMA:图谱增强记忆如何革新AI智能体的复杂任务规划与推理

1. 项目概述:当智能体拥有“记忆图谱”最近在折腾AI智能体(Agents)时,我总被一个问题困扰:智能体怎么才能记住更复杂、更结构化的事情?比如,你让它帮你规划一个项目,它可能记得“要写…

2026/8/24 9:48:11 阅读更多 →
react-keyframes源码深度解析:89行TypeScript如何实现React逐帧动画?

react-keyframes源码深度解析:89行TypeScript如何实现React逐帧动画?

react-keyframes源码深度解析:89行TypeScript如何实现React逐帧动画? 【免费下载链接】react-keyframes Create frame-based animations in React 项目地址: https://gitcode.com/gh_mirrors/re/react-keyframes react-keyframes 是一个在 React …

2026/8/24 9:48:11 阅读更多 →

最新新闻

从单智能体到多Agent协作:基于Dify构建复杂任务处理系统实战

从单智能体到多Agent协作:基于Dify构建复杂任务处理系统实战

1. 先搞清楚“多 Agent 协作”到底能解决什么实际问题如果你正在用 Dify、Coze 这类平台做 AI 应用,大概率遇到过这种困境:单个智能体(Agent)能力有限,处理复杂任务时要么逻辑混乱,要么需要你手动在不同工具…

2026/8/24 13:32:23 阅读更多 →
别再瞎改了,AI写论文死就死在格式和引用上

别再瞎改了,AI写论文死就死在格式和引用上

两种人,两种结局:一种人用AI写论文,初稿出来就被导师打回,批注里写满“逻辑混乱”“不像你的水平”;另一种人交上去的论文,导师只问了一句“参考文献核过了吗”,然后顺利通过。差别不在谁更聪明…

2026/8/24 13:32:23 阅读更多 →
初稿找大模型、定稿用双降、复检只改标红:论文最后72小时降重降AI,3类工具+4步用法一篇说清

初稿找大模型、定稿用双降、复检只改标红:论文最后72小时降重降AI,3类工具+4步用法一篇说清

先抛一个反常识的实测结论:把同一篇论文定稿章节分别交给 6 类工具处理后,3 组用通用大模型直接“改写降重”的文本,AIGC 疑似率不仅没降,反而平均升高了 11% 左右;真正能在提交前把重复率和 AIGC 率同时压到 10% 以下…

2026/8/24 13:32:23 阅读更多 →
理工科硕士混用多模型写论文:初稿、中稿、定稿AIGC检测工具怎么选,一篇说清

理工科硕士混用多模型写论文:初稿、中稿、定稿AIGC检测工具怎么选,一篇说清

你用Deepseek梳理了3组对照实验的数据分析,让Kimi帮你补了12篇外文文献的综述逻辑,最后用GPT-4润色了讨论部分的专业表述——刚把整合好的论文贴进某免费检测工具,AIGC率显示68%,但你明明逐段调整了句式,甚至自己重写了…

2026/8/24 13:32:23 阅读更多 →
实测6款AI后,我用毕业之家30分钟做完开题:只解决导师最在意的文献真假问题

实测6款AI后,我用毕业之家30分钟做完开题:只解决导师最在意的文献真假问题

上周我用同一道硕士开题题——《基于多模态大模型的工业表面缺陷小样本检测方法研究》——分别让 ChatGPT、Claude、Gemini、DeepSeek R1、Kimi 和毕业之家生成开题报告初稿。结果很直接:毕业之家列出的12篇参考文献全部附 DOI 或知网跳转,逐篇可查&…

2026/8/24 13:32:23 阅读更多 →
如何使用 MMD Tools:从 PMX 导入到 VMD 导出的完整指南

如何使用 MMD Tools:从 PMX 导入到 VMD 导出的完整指南

如何使用 MMD Tools:从 PMX 导入到 VMD 导出的完整指南 【免费下载链接】blender_mmd_tools MMD Tools is a Blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …

2026/8/24 13:31:23 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →