├── .DS_Store ├── .gitignore ├── 01. multi_thread_craw.py ├── 02. producer_consumer_spider.py ├── 02.data.txt ├── 03. lock_concurrent.py ├── 04. thread_pool.py ├── 05. flask_thread_pool.py ├── 06. thread_process_cpu_bound.py ├── 07. flask_process_pool.py ├── 08. async_spider.py ├── 09. subprocess.py ├── 10. async_spider_semaphore.py ├── 11. gevent_spider.py ├── 12. gevent_flask.py ├── 12. gevent_flask3.py ├── Python并发编程简介.pptx ├── README.md ├── [蚂蚁学Python] Python并发编程.md ├── [蚂蚁学Python] Python并发编程.png ├── [蚂蚁学Python] Python并发编程.xmind ├── blog_spider.py ├── datas ├── 7z_test.7z └── 余生一个浪.mp3 └── tmp ├── 01. multi_thread_craw.py ├── 02. producer_consumer_craw.py ├── 06. thread_vs_process.py └── blog_spider.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .idea/ 132 | -------------------------------------------------------------------------------- /01. multi_thread_craw.py: -------------------------------------------------------------------------------- 1 | import blog_spider 2 | import threading 3 | import time 4 | 5 | 6 | def single_thread(): 7 | print("single_thread begin") 8 | for url in blog_spider.urls: 9 | blog_spider.craw(url) 10 | print("single_thread end") 11 | 12 | 13 | def multi_thread(): 14 | print("multi_thread begin") 15 | threads = [] 16 | for url in blog_spider.urls: 17 | threads.append( 18 | threading.Thread(target=blog_spider.craw, args=(url,)) 19 | ) 20 | 21 | for thread in threads: 22 | thread.start() 23 | 24 | for thread in threads: 25 | thread.join() 26 | 27 | print("multi_thread end") 28 | 29 | 30 | if __name__ == "__main__": 31 | start = time.time() 32 | single_thread() 33 | end = time.time() 34 | print("single thread cost:", end - start, "seconds") 35 | 36 | start = time.time() 37 | multi_thread() 38 | end = time.time() 39 | print("multi thread cost:", end - start, "seconds") 40 | -------------------------------------------------------------------------------- /02. producer_consumer_spider.py: -------------------------------------------------------------------------------- 1 | import queue 2 | import blog_spider 3 | import time 4 | import random 5 | import threading 6 | 7 | 8 | def do_craw(url_queue: queue.Queue, html_queue: queue.Queue): 9 | while True: 10 | url = url_queue.get() 11 | html = blog_spider.craw(url) 12 | html_queue.put(html) 13 | print(threading.current_thread().name, f"craw {url}", 14 | "url_queue.size=", url_queue.qsize()) 15 | time.sleep(random.randint(1, 2)) 16 | 17 | 18 | def do_parse(html_queue: queue.Queue, fout): 19 | while True: 20 | html = html_queue.get() 21 | results = blog_spider.parse(html) 22 | for result in results: 23 | fout.write(str(result) + "\n") 24 | print(threading.current_thread().name, f"results.size", len(results), 25 | "html_queue.size=", html_queue.qsize()) 26 | time.sleep(random.randint(1, 2)) 27 | 28 | 29 | if __name__ == "__main__": 30 | url_queue = queue.Queue() 31 | html_queue = queue.Queue() 32 | for url in blog_spider.urls: 33 | url_queue.put(url) 34 | 35 | for idx in range(3): 36 | t = threading.Thread(target=do_craw, args=(url_queue, html_queue), 37 | name=f"craw{idx}") 38 | t.start() 39 | 40 | fout = open("02.data.txt", "w") 41 | for idx in range(2): 42 | t = threading.Thread(target=do_parse, args=(html_queue, fout), 43 | name=f"parse{idx}") 44 | t.start() 45 | -------------------------------------------------------------------------------- /02.data.txt: -------------------------------------------------------------------------------- 1 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 2 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 3 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 4 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 5 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 6 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 7 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 8 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 9 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 10 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 11 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 12 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 13 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 14 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 15 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 16 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 17 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 18 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 19 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 20 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 21 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 22 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 23 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 24 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 25 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 26 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 27 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 28 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 29 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 30 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 31 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 32 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 33 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 34 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 35 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 36 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 37 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 38 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 39 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 40 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 41 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 42 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 43 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 44 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 45 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 46 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 47 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 48 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 49 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 50 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 51 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 52 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 53 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 54 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 55 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 56 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 57 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 58 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 59 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 60 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 61 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 62 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 63 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 64 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 65 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 66 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 67 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 68 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 69 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 70 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 71 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 72 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 73 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 74 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 75 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 76 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 77 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 78 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 79 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 80 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 81 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 82 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 83 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 84 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 85 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 86 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 87 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 88 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 89 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 90 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 91 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 92 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 93 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 94 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 95 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 96 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 97 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 98 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 99 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 100 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 101 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 102 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 103 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 104 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 105 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 106 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 107 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 108 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 109 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 110 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 111 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 112 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 113 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 114 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 115 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 116 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 117 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 118 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 119 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 120 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 121 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 122 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 123 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 124 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 125 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 126 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 127 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 128 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 129 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 130 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 131 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 132 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 133 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 134 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 135 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 136 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 137 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 138 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 139 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 140 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 141 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 142 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 143 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 144 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 145 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 146 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 147 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 148 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 149 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 150 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 151 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 152 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 153 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 154 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 155 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 156 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 157 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 158 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 159 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 160 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 161 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 162 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 163 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 164 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 165 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 166 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 167 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 168 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 169 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 170 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 171 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 172 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 173 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 174 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 175 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 176 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 177 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 178 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 179 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 180 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 181 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 182 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 183 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 184 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 185 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 186 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 187 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 188 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 189 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 190 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 191 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 192 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 193 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 194 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 195 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 196 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 197 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 198 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 199 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 200 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 201 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 202 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 203 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 204 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 205 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 206 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 207 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 208 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 209 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 210 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 211 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 212 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 213 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 214 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 215 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 216 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 217 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 218 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 219 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 220 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 221 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 222 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 223 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 224 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 225 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 226 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 227 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 228 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 229 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 230 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 231 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 232 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 233 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 234 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 235 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 236 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 237 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 238 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 239 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 240 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 241 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 242 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 243 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 244 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 245 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 246 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 247 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 248 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 249 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 250 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 251 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 252 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 253 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 254 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 255 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 256 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 257 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 258 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 259 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 260 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 261 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 262 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 263 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 264 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 265 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 266 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 267 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 268 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 269 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 270 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 271 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 272 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 273 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 274 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 275 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 276 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 277 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 278 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 279 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 280 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 281 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 282 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 283 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 284 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 285 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 286 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 287 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 288 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 289 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 290 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 291 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 292 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 293 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 294 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 295 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 296 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 297 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 298 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 299 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 300 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 301 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 302 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 303 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 304 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 305 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 306 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 307 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 308 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 309 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 310 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 311 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 312 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 313 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 314 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 315 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 316 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 317 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 318 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 319 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 320 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 321 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 322 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 323 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 324 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 325 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 326 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 327 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 328 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 329 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 330 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 331 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 332 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 333 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 334 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 335 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 336 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 337 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 338 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 339 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 340 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 341 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 342 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 343 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 344 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 345 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 346 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 347 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 348 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 349 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 350 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 351 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 352 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 353 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 354 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 355 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 356 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 357 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 358 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 359 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 360 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 361 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 362 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 363 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 364 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 365 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 366 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 367 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 368 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 369 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 370 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 371 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 372 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 373 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 374 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 375 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 376 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 377 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 378 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 379 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 380 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 381 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 382 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 383 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 384 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 385 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 386 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 387 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 388 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 389 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 390 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 391 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 392 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 393 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 394 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 395 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 396 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 397 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 398 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 399 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 400 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 401 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 402 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 403 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 404 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 405 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 406 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 407 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 408 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 409 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 410 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 411 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 412 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 413 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 414 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 415 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 416 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 417 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 418 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 419 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 420 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 421 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 422 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 423 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 424 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 425 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 426 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 427 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 428 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 429 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 430 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 431 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 432 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 433 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 434 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 435 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 436 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 437 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 438 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 439 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 440 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 441 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 442 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 443 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 444 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 445 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 446 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 447 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 448 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 449 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 450 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 451 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 452 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 453 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 454 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 455 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 456 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 457 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 458 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 459 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 460 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 461 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 462 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 463 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 464 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 465 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 466 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 467 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 468 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 469 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 470 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 471 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 472 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 473 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 474 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 475 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 476 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 477 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 478 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 479 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 480 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 481 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 482 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 483 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 484 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 485 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 486 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 487 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 488 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 489 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 490 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 491 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 492 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 493 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 494 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 495 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 496 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 497 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 498 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 499 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 500 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 501 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 502 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 503 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 504 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 505 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 506 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 507 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 508 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 509 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 510 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 511 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 512 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 513 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 514 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 515 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 516 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 517 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 518 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 519 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 520 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 521 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 522 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 523 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 524 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 525 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 526 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 527 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 528 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 529 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 530 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 531 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 532 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 533 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 534 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 535 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 536 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 537 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 538 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 539 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 540 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 541 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 542 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 543 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 544 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 545 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 546 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 547 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 548 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 549 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 550 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 551 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 552 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 553 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 554 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 555 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 556 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 557 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 558 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 559 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 560 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 561 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 562 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 563 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 564 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 565 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 566 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 567 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 568 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 569 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 570 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 571 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 572 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 573 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 574 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 575 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 576 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 577 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 578 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 579 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 580 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 581 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 582 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 583 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 584 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 585 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 586 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 587 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 588 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 589 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 590 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 591 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 592 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 593 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 594 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 595 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 596 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 597 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 598 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 599 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 600 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 601 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 602 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 603 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 604 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 605 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 606 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 607 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 608 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 609 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 610 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 611 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 612 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 613 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 614 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 615 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 616 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 617 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 618 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 619 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 620 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 621 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 622 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 623 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 624 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 625 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 626 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 627 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 628 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 629 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 630 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 631 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 632 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 633 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 634 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 635 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 636 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 637 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 638 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 639 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 640 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 641 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 642 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 643 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 644 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 645 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 646 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 647 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 648 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 649 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 650 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 651 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 652 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 653 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 654 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 655 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 656 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 657 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 658 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 659 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 660 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 661 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 662 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 663 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 664 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 665 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 666 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 667 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 668 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 669 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 670 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 671 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 672 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 673 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 674 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 675 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 676 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 677 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 678 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 679 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 680 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 681 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 682 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 683 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 684 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 685 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 686 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 687 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 688 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 689 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 690 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 691 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 692 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 693 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 694 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 695 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 696 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 697 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 698 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 699 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 700 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 701 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 702 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 703 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 704 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 705 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 706 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 707 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 708 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 709 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 710 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 711 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 712 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 713 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 714 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 715 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 716 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 717 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 718 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 719 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 720 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 721 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 722 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 723 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 724 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 725 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 726 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 727 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 728 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 729 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 730 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 731 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 732 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 733 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 734 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 735 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 736 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 737 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 738 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 739 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 740 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 741 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 742 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 743 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 744 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 745 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 746 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 747 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 748 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 749 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 750 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 751 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 752 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 753 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 754 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 755 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 756 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 757 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 758 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 759 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 760 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 761 | ('https://www.cnblogs.com/boycelee/p/13951819.html', '极验无感验证') 762 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 763 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 764 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 765 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 766 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 767 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 768 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 769 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 770 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 771 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 772 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 773 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 774 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 775 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 776 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 777 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 778 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 779 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 780 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 781 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 782 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 783 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 784 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 785 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 786 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 787 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 788 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 789 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 790 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 791 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 792 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 793 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 794 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 795 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 796 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 797 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 798 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 799 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 800 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 801 | ('https://www.cnblogs.com/boycelee/p/13951819.html', '极验无感验证') 802 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 803 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 804 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 805 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 806 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 807 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 808 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 809 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 810 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 811 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 812 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 813 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 814 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 815 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 816 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 817 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 818 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 819 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 820 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 821 | ('https://www.cnblogs.com/boycelee/p/13951819.html', '极验无感验证') 822 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 823 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 824 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 825 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 826 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 827 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 828 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 829 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 830 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 831 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 832 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 833 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 834 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 835 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 836 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 837 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 838 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 839 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 840 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 841 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 842 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 843 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 844 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 845 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 846 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 847 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 848 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 849 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 850 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 851 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 852 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 853 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 854 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 855 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 856 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 857 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 858 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 859 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 860 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 861 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 862 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 863 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 864 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 865 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 866 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 867 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 868 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 869 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 870 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 871 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 872 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 873 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 874 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 875 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 876 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 877 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 878 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 879 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 880 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 881 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 882 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 883 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 884 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 885 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 886 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 887 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 888 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 889 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 890 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 891 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 892 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 893 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 894 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 895 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 896 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 897 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 898 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 899 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 900 | ('https://www.cnblogs.com/lcgbk/p/13950284.html', '【QT】子类化QObject+moveToThread实现多线程') 901 | ('https://www.cnblogs.com/boycelee/p/13951819.html', '极验无感验证') 902 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 903 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 904 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 905 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 906 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 907 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 908 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 909 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 910 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 911 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 912 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 913 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 914 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 915 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 916 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 917 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 918 | ('https://www.cnblogs.com/redragon/p/13950744.html', 'ERP的权限管理的操作与设计--开源软件诞生24') 919 | ('https://www.cnblogs.com/dy99/p/13950641.html', 'Python调用飞书发送消息') 920 | ('https://www.cnblogs.com/zhaoke271828/p/13939591.html', 'Hill密码(Java)') 921 | ('https://www.cnblogs.com/boycelee/p/13951819.html', '极验无感验证') 922 | ('https://www.cnblogs.com/chenyanbin/p/13908389.html', 'Spring Cloud 纯干货,从入门到实战') 923 | ('https://www.cnblogs.com/gaofei200/p/13951764.html', '一个名为不安全的类Unsafe') 924 | ('https://www.cnblogs.com/qiuhom-1874/p/13950287.html', '分布式文档存储数据库之MongoDB索引管理') 925 | ('https://www.cnblogs.com/FLY_DREAM/p/13951719.html', '【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境') 926 | ('https://www.cnblogs.com/LXP-Never/p/13951578.html', 'pytorch训练GAN时的detach()') 927 | ('https://www.cnblogs.com/henjay724/p/13951686.html', '痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计') 928 | ('https://www.cnblogs.com/fnng/p/13951673.html', '自己上手写性能测试工具(二)') 929 | ('https://www.cnblogs.com/cicada-smile/p/13951635.html', '编码风格:Mvc模式下SSM环境,代码分层管理') 930 | ('https://www.cnblogs.com/britney/p/13951535.html', 'Youtube订阅——解决在弹窗内使用Youtube订阅按钮高度显示不全的问题') 931 | ('https://www.cnblogs.com/sunfulv/p/13951474.html', '按揭贷款的计算原理与java实现') 932 | ('https://www.cnblogs.com/TonvyLeeBlogs/p/13951303.html', 'CUDA常用概念及注意点') 933 | ('https://www.cnblogs.com/lan-blue/p/13951253.html', '多服务器使用Docker设置一主一从三哨兵redis(完整)') 934 | ('https://www.cnblogs.com/skaarl/p/13951169.html', 'MySQL查询这一篇就够了') 935 | ('https://www.cnblogs.com/caojiaxin/p/13951159.html', '正式班D25') 936 | ('https://www.cnblogs.com/54chensongxia/p/13951161.html', '当我们开发一个接口时需要注意些什么') 937 | ('https://www.cnblogs.com/bigsai/p/13951123.html', '面试官:缓存穿透、缓存雪崩和缓存击穿是什么?') 938 | -------------------------------------------------------------------------------- /03. lock_concurrent.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import time 3 | 4 | lock = threading.Lock() 5 | 6 | class Account: 7 | def __init__(self, balance): 8 | self.balance = balance 9 | 10 | 11 | def draw(account, amount): 12 | with lock: 13 | if account.balance >= amount: 14 | time.sleep(0.1) 15 | print(threading.current_thread().name, 16 | "取钱成功") 17 | account.balance -= amount 18 | print(threading.current_thread().name, 19 | "余额", account.balance) 20 | else: 21 | print(threading.current_thread().name, 22 | "取钱失败,余额不足") 23 | 24 | 25 | if __name__ == "__main__": 26 | account = Account(1000) 27 | ta = threading.Thread(name="ta", target=draw, args=(account, 800)) 28 | tb = threading.Thread(name="tb", target=draw, args=(account, 800)) 29 | 30 | ta.start() 31 | tb.start() 32 | -------------------------------------------------------------------------------- /04. thread_pool.py: -------------------------------------------------------------------------------- 1 | 2 | import concurrent.futures 3 | import blog_spider 4 | 5 | # craw 6 | with concurrent.futures.ThreadPoolExecutor() as pool: 7 | htmls = pool.map(blog_spider.craw, blog_spider.urls) 8 | htmls = list(zip(blog_spider.urls, htmls)) 9 | for url, html in htmls: 10 | print(url, len(html)) 11 | 12 | print("craw over") 13 | 14 | # parse 15 | with concurrent.futures.ThreadPoolExecutor() as pool: 16 | futures = {} 17 | for url, html in htmls: 18 | future = pool.submit(blog_spider.parse, html) 19 | futures[future] = url 20 | 21 | #for future, url in futures.items(): 22 | # print(url, future.result()) 23 | 24 | for future in concurrent.futures.as_completed(futures): 25 | url = futures[future] 26 | print(url, future.result()) -------------------------------------------------------------------------------- /05. flask_thread_pool.py: -------------------------------------------------------------------------------- 1 | import flask 2 | import json 3 | import time 4 | from concurrent.futures import ThreadPoolExecutor 5 | 6 | app = flask.Flask(__name__) 7 | pool = ThreadPoolExecutor() 8 | 9 | 10 | def read_file(): 11 | time.sleep(0.1) 12 | return "file result" 13 | 14 | 15 | def read_db(): 16 | time.sleep(0.2) 17 | return "db result" 18 | 19 | 20 | def read_api(): 21 | time.sleep(0.3) 22 | return "api result" 23 | 24 | 25 | @app.route("/") 26 | def index(): 27 | result_file = pool.submit(read_file) 28 | result_db = pool.submit(read_db) 29 | result_api = pool.submit(read_api) 30 | 31 | return json.dumps({ 32 | "result_file": result_file.result(), 33 | "result_db": result_db.result(), 34 | "result_api": result_api.result(), 35 | }) 36 | 37 | 38 | if __name__ == "__main__": 39 | app.run() 40 | -------------------------------------------------------------------------------- /06. thread_process_cpu_bound.py: -------------------------------------------------------------------------------- 1 | import math 2 | from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor 3 | import time 4 | 5 | PRIMES = [112272535095293] * 100 6 | 7 | 8 | def is_prime(n): 9 | if n < 2: 10 | return False 11 | if n == 2: 12 | return True 13 | if n % 2 == 0: 14 | return False 15 | sqrt_n = int(math.floor(math.sqrt(n))) 16 | for i in range(3, sqrt_n + 1, 2): 17 | if n % i == 0: 18 | return False 19 | return True 20 | 21 | 22 | def single_thread(): 23 | for number in PRIMES: 24 | is_prime(number) 25 | 26 | 27 | def multi_thread(): 28 | with ThreadPoolExecutor() as pool: 29 | pool.map(is_prime, PRIMES) 30 | 31 | 32 | def multi_process(): 33 | with ProcessPoolExecutor() as pool: 34 | pool.map(is_prime, PRIMES) 35 | 36 | 37 | if __name__ == "__main__": 38 | start = time.time() 39 | single_thread() 40 | end = time.time() 41 | print("single_thread, cost:", end - start, "seconds") 42 | 43 | start = time.time() 44 | multi_thread() 45 | end = time.time() 46 | print("multi_thread, cost:", end - start, "seconds") 47 | 48 | start = time.time() 49 | multi_process() 50 | end = time.time() 51 | print("multi_process, cost:", end - start, "seconds") 52 | -------------------------------------------------------------------------------- /07. flask_process_pool.py: -------------------------------------------------------------------------------- 1 | import flask 2 | from concurrent.futures import ProcessPoolExecutor 3 | import math 4 | import json 5 | 6 | 7 | app = flask.Flask(__name__) 8 | 9 | 10 | def is_prime(n): 11 | if n < 2: 12 | return False 13 | if n == 2: 14 | return True 15 | if n % 2 == 0: 16 | return False 17 | sqrt_n = int(math.floor(math.sqrt(n))) 18 | for i in range(3, sqrt_n + 1, 2): 19 | if n % i == 0: 20 | return False 21 | return True 22 | 23 | 24 | @app.route("/is_prime/") 25 | def api_is_prime(numbers): 26 | number_list = [int(x) for x in numbers.split(",")] 27 | results = process_pool.map(is_prime, number_list) 28 | return json.dumps(dict(zip(number_list, results))) 29 | 30 | 31 | if __name__ == "__main__": 32 | process_pool = ProcessPoolExecutor() 33 | app.run() 34 | -------------------------------------------------------------------------------- /08. async_spider.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import aiohttp 3 | import blog_spider 4 | 5 | 6 | async def async_craw(url): 7 | print("craw url: ", url) 8 | async with aiohttp.ClientSession() as session: 9 | async with session.get(url) as resp: 10 | result = await resp.text() 11 | print(f"craw url: {url}, {len(result)}") 12 | 13 | 14 | loop = asyncio.get_event_loop() 15 | 16 | tasks = [ 17 | loop.create_task(async_craw(url)) 18 | for url in blog_spider.urls] 19 | 20 | import time 21 | 22 | start = time.time() 23 | loop.run_until_complete(asyncio.wait(tasks)) 24 | end = time.time() 25 | print("use time seconds: ", end - start) 26 | -------------------------------------------------------------------------------- /09. subprocess.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | 3 | """ 4 | proc = subprocess.Popen( 5 | ["start", "./datas/余生一个浪.mp3"], 6 | shell=True 7 | ) 8 | 9 | proc.communicate() 10 | 11 | """ 12 | 13 | proc = subprocess.Popen( 14 | [r"C:\Program Files\7-Zip\7z.exe", 15 | "x", 16 | "./datas/7z_test.7z", 17 | "-o./datas/extract_7z", 18 | "-aoa"], 19 | shell=True 20 | ) 21 | 22 | proc.communicate() 23 | -------------------------------------------------------------------------------- /10. async_spider_semaphore.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import aiohttp 3 | import blog_spider 4 | 5 | semaphore = asyncio.Semaphore(10) 6 | 7 | 8 | async def async_craw(url): 9 | async with semaphore: 10 | print("craw url: ", url) 11 | async with aiohttp.ClientSession() as session: 12 | async with session.get(url) as resp: 13 | result = await resp.text() 14 | await asyncio.sleep(5) 15 | print(f"craw url: {url}, {len(result)}") 16 | 17 | 18 | loop = asyncio.get_event_loop() 19 | 20 | tasks = [ 21 | loop.create_task(async_craw(url)) 22 | for url in blog_spider.urls] 23 | 24 | import time 25 | 26 | start = time.time() 27 | loop.run_until_complete(asyncio.wait(tasks)) 28 | end = time.time() 29 | print("use time seconds: ", end - start) 30 | -------------------------------------------------------------------------------- /11. gevent_spider.py: -------------------------------------------------------------------------------- 1 | import gevent.monkey 2 | 3 | gevent.monkey.patch_all() 4 | 5 | import gevent 6 | import blog_spider 7 | import time 8 | 9 | begin = time.time() 10 | for url in blog_spider.urls: 11 | blog_spider.craw(url) 12 | end = time.time() 13 | print("single thread, cost = ", end - begin) 14 | 15 | begin = time.time() 16 | tasks = [gevent.spawn(blog_spider.craw, url) for url in blog_spider.urls] 17 | gevent.joinall(tasks) 18 | end = time.time() 19 | print("gevent, cost = ", end - begin) 20 | -------------------------------------------------------------------------------- /12. gevent_flask.py: -------------------------------------------------------------------------------- 1 | from gevent import monkey 2 | 3 | monkey.patch_all() 4 | 5 | from flask import Flask 6 | from gevent import pywsgi 7 | 8 | app = Flask(__name__) 9 | 10 | 11 | @app.route("/") 12 | def index(): 13 | return "success" 14 | 15 | 16 | if __name__ == "__main__": 17 | # app.run() 18 | server = pywsgi.WSGIServer( 19 | ("0.0.0.0", 8888), app) 20 | server.serve_forever() 21 | -------------------------------------------------------------------------------- /12. gevent_flask3.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | 3 | app = Flask(__name__) 4 | 5 | 6 | @app.route("/") 7 | def index(): 8 | return "success" 9 | 10 | 11 | if __name__ == "__main__": 12 | app.run() 13 | -------------------------------------------------------------------------------- /Python并发编程简介.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/Python并发编程简介.pptx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ant-learn-python-concurrent 2 | 3 | ***本仓库迁移回国内,速度更快:[gitee链接](https://gitee.com/antpython/ant-learn-python-concurrent)*** 4 | 5 | Python并发编程专题 6 | 7 | 微信公众号: 8 | 9 | 蚂蚁学Python 10 | 11 | 课程视频全集: 12 | 13 | https://zhishi.m.iqiyi.com/column?columnId=7983655870076401&selfsale=d79ef4530f43c30b 14 | -------------------------------------------------------------------------------- /[蚂蚁学Python] Python并发编程.md: -------------------------------------------------------------------------------- 1 | # [蚂蚁学Python] 2 | Python并发编程 3 | 4 | ## 并发编程介绍 5 | 6 | ### 学习并发编程 7 | 8 | - 加速程序的运行 9 | - 高薪程序员必备能力 10 | 11 | ### 程序运行的5种并发粒度 12 | 13 | - 单线程 14 | - 单线程多协程 15 | - 多线程 16 | - 多进程 17 | - 多机器 18 | 19 | ### 怎样选择并发技术 20 | 21 | - 如果单机无法搞定 22 | 23 | - 大数据计算 24 | 25 | - IO密集型 26 | 27 | - CPU经常在等待IO 28 | - 比如网络爬虫 29 | - 选择1:多协程 coroutine 30 | - 选择2:多线程 threading 31 | 32 | - CPU密集型 33 | 34 | - 计算密集型,CPU计算为主 35 | - 比如加密解密 36 | - 使用多进程multithreading 37 | 38 | ### 线程池和进程池 39 | 40 | - 原理:提前创建好线程/进程放在池子里,新的task到来可以重用这些资源,减少了新建、终止线程/进程的开销 41 | - 池化的好处 42 | 43 | - 提升性能:因为减去了大量新建、终止线程的开销,重用了线程资源 44 | - 适用场景:适合处理突发性大量请求或需要大量线程完成任务、但实际任务处理时间较短 45 | - 防御功能:能有效避免系统因为创建线程过多,而导致系统负荷过大响应变慢等问题 46 | - 代码简洁:使用线程池的语法比自己新建线程执行线程更加简洁 47 | 48 | ## 全局解释器锁GIL 49 | 50 | ### 任何时刻仅有一个线程在执行。 51 | 52 | ### 在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程 53 | 54 | ### GIL目的:为了解决多线程之间数据完整性和状态同步问题 55 | 56 | ### GIL带来的问题 57 | 58 | - 即使使用了多线程,同一时刻也只有单个线程使用CPU,导致多核CPU的浪费 59 | - GIL只会对CPU密集型的程序产生影响 60 | - 如果程序主要是在做I/O操作,比如处理网络连接,那么多线程技术常常是一个明智的选择 61 | 62 | ### 规避GIL的方法 63 | 64 | - 规避方法2: 使用multiprocessing多进程,对CPU密集型计算,单独启动子进程解释器去执行 65 | - 规避方法2: 将计算密集型的任务转移到C语言中,因为C语言比Python快得多,注意要在C语言中自己释放GIL 66 | 67 | ## 多线程编程 68 | 69 | ### 应用于IO密集型计算,比如几乎所有的网络后台服务、网络爬虫 70 | 71 | ### 引入模块 72 | 73 | - from threading import Thread 74 | 75 | ### 新建、启动、等待结束 76 | 77 | - t=Thread(target=func, args=(100, )) 78 | t.start() 79 | t.join() 80 | 81 | ### 数据通信 82 | 83 | - import queue 84 | q = queue.Queue() 85 | q.put(item) 86 | item = q.get() 87 | 88 | ### 线程安全加锁 89 | 90 | - from threading import Lock 91 | lock = Lock() 92 | with lock: 93 | # do something 94 | 95 | ### 信号量限制并发 96 | 97 | - from threading import Semaphore 98 | semaphre = Semaphore(10) 99 | with semaphre: 100 | # do something 101 | 102 | ### 使用线程池 103 | 104 | - from concurrent.futures import ThreadPoolExecutor 105 | 106 | with ThreadPoolExecutor() as executor: 107 | # 方法1 108 | results = executor.map(func, [1,2,3]) 109 | 110 | # 方法2 111 | future = executor.submit(func, 1) 112 | result = future.result() 113 | 114 | ## 多进程编程 115 | 116 | ### 应用于CPU密集型计算,只有发现多线程编程有性能问题时,才求助于该模块 117 | 118 | ### 引入模块 119 | 120 | - from multiprocessing import Process 121 | 122 | ### 新建、启动、等待结束 123 | 124 | - p = Process(target=f, args=('bob',)) 125 | p.start() 126 | p.join() 127 | 128 | ### 数据通信 129 | 130 | - from multiprocessing import Queue 131 | q = Queue() 132 | q.put([42, None, 'hello']) 133 | item = q.get() 134 | 135 | ### 线程安全加锁 136 | 137 | - from multiprocessing import Lock 138 | lock = Lock() 139 | with lock: 140 | # do something 141 | 142 | ### 信号量限制并发 143 | 144 | - from multiprocessing import Semaphore 145 | semaphore = Semaphore(10) 146 | with semaphore: 147 | # do something 148 | 149 | ### 进程池 150 | 151 | - from concurrent.futures import ProcessPoolExecutor 152 | 153 | with ProcessPoolExecutor() as executor: 154 | # 方法1 155 | results = executor.map(func, [1,2,3]) 156 | 157 | # 方法2 158 | future = executor.submit(func, 1) 159 | result = future.result() 160 | 161 | ## 多协程编程 162 | 163 | ### 异步编程的威力 164 | 165 | - Nginx作为 Web 服务器: 166 | 打败了 同步阻塞服务器 Apache, 使用更少的资源支持更多的并发连接,体现更高的效率,能够支持高达 50,000 个并发连接数的响应,使用 epoll and kqueue 作为开发模型 167 | - Redis为什么这么快: 168 | 处理网络请求采用单线程+使用多路I/O复用模型,非阻塞IO ,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 169 | - Node.js的优势: 170 | 采用事件驱动、异步编程,为网络服务而设计。其实Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程 171 | Node.js非阻塞模式的IO处理带来在相对低系统资源耗用下的高性能与出众的负载能力,非常适合用作依赖其它IO资源的中间层服务 172 | - Go语言的一个优势: 173 | Go 使用Goroutine 和 channel为生成协程和使用信道提供了轻量级的语法,使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题,相比Python单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好 174 | 175 | ### 异步编程的原理 176 | 177 | - 核心原理1:超级循环 178 | 179 | - 在单线程内实现并发 180 | - 用一个超级循环(其实就是while true)循环,里面每次轮询处理所有的task 181 | - 记忆口诀: 182 | 《the one loop》 183 | 至尊循环驭众生 184 | 至尊循环寻众生 185 | 至尊循环引众生 186 | 普照众生欣欣荣 187 | 188 | - 核心原理2:IO多路复用 189 | 190 | - 原理 191 | 192 | - 是一种同步IO模型,实现一个线程可以监视多个文件句柄; 193 | - 一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作; 194 | - 没有文件句柄就绪时会阻塞应用程序,交出cpu 195 | - 多路是指网络连接,复用指的是同一个线程 196 | 197 | - 3种实现方式 198 | 199 | - select 200 | 201 | - 数据结构:bitmap 202 | - 最大连接数:1024 203 | - fd拷贝:每次调用select拷贝 204 | - 工作效率:轮询O(N) 205 | 206 | - poll 207 | 208 | - 数据结构:数组 209 | - 最大连接数:无上限 210 | - fd拷贝:每次调用poll拷贝 211 | - 工作效率:轮询O(N) 212 | 213 | - epool 214 | 215 | - 数据结构:红黑树 216 | - 最大连接数:无上限 217 | - fd拷贝:fd首次调用epool_ctl拷贝,每次调用epoll_wait不拷贝 218 | - 工作效率:回调O(1) 219 | 220 | ### Python官方异步库:asyncio 221 | 222 | - 代码例子 223 | 224 | - import asyncio 225 | 226 | # 获取事件循环 227 | loop = asyncio.get_event_loop() 228 | 229 | # 定义协程 230 | async def myfunc(url): 231 | await get_url(url) 232 | 233 | # 创建task列表 234 | tasks = [loop.create_task(myfunc(url)) for url in urls] 235 | 236 | # 执行爬虫事件列表 237 | loop.run_until_complete(asyncio.wait(tasks)) 238 | 239 | - 优点: 240 | 241 | - 官方库支持 242 | - 明确使用asyncio、await关键字编程,直观易读 243 | 244 | - 缺点: 245 | 246 | - 很多库不支持,比如requests 247 | 248 | ### Python第三方异步库:Gevent 249 | 250 | - 代码例子 251 | 252 | - import gevent.monkey 253 | 254 | gevent.monkey.patch_all() 255 | 256 | import gevent 257 | import blog_spider 258 | import time 259 | 260 | begin = time.time() 261 | for url in blog_spider.urls: 262 | blog_spider.craw(url) 263 | end = time.time() 264 | print("single thread, cost = ", end - begin) 265 | 266 | begin = time.time() 267 | tasks = [gevent.spawn(blog_spider.craw, url) for url in blog_spider.urls] 268 | gevent.joinall(tasks) 269 | end = time.time() 270 | print("gevent, cost = ", end - begin) 271 | 272 | - 原理 273 | 274 | - 提供猴子补丁MonkeyPatch方法,通过该方法gevent能够 修改标准库里面大部分的阻塞式系统调用,包括socket、ssl、threading和 select等模块,而变为协作式运行 275 | 276 | - 优点 277 | 278 | - 只需要monkey.patch_all(),就能自动修改阻塞为非阻塞 279 | - 提供了pywsgi异步服务器可以封装flask 280 | 281 | - 缺点 282 | 283 | - 不知道它具体patch了哪些库修改了哪些模块、类、函数 284 | - 创造了“隐式的副作用”,如果出现问题很多时候极难调试 285 | 286 | -------------------------------------------------------------------------------- /[蚂蚁学Python] Python并发编程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/[蚂蚁学Python] Python并发编程.png -------------------------------------------------------------------------------- /[蚂蚁学Python] Python并发编程.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/[蚂蚁学Python] Python并发编程.xmind -------------------------------------------------------------------------------- /blog_spider.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | 4 | urls = [ 5 | f"https://www.cnblogs.com/sitehome/p/{page}" 6 | for page in range(1, 50 + 1) 7 | ] 8 | 9 | 10 | def craw(url): 11 | #print("craw url: ", url) 12 | r = requests.get(url) 13 | return r.text 14 | 15 | 16 | def parse(html): 17 | # class="post-item-title" 18 | soup = BeautifulSoup(html, "html.parser") 19 | links = soup.find_all("a", class_="post-item-title") 20 | return [(link["href"], link.get_text()) for link in links] 21 | 22 | 23 | if __name__ == "__main__": 24 | for result in parse(craw(urls[2])): 25 | print(result) 26 | -------------------------------------------------------------------------------- /datas/7z_test.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/datas/7z_test.7z -------------------------------------------------------------------------------- /datas/余生一个浪.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/datas/余生一个浪.mp3 -------------------------------------------------------------------------------- /tmp/01. multi_thread_craw.py: -------------------------------------------------------------------------------- 1 | import blog_spider 2 | import threading 3 | import time 4 | 5 | 6 | def single_thread(): 7 | print("single_thread begin") 8 | for url in blog_spider.urls: 9 | blog_spider.craw(url) 10 | print("single_thread end") 11 | 12 | 13 | def multi_thread(): 14 | print("multi_thread begin") 15 | threads = [] 16 | for url in blog_spider.urls: 17 | threads.append( 18 | threading.Thread(target=blog_spider.craw, args=(url,)) 19 | ) 20 | 21 | for thread in threads: 22 | thread.start() 23 | 24 | for thread in threads: 25 | thread.join() 26 | 27 | print("multi_thread end") 28 | 29 | 30 | if __name__ == "__main__": 31 | start = time.time() 32 | single_thread() 33 | end = time.time() 34 | print("single thread cost:", end - start, "seconds") 35 | 36 | start = time.time() 37 | multi_thread() 38 | end = time.time() 39 | print("multi thread cost:", end - start, "seconds") 40 | -------------------------------------------------------------------------------- /tmp/02. producer_consumer_craw.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/peiss/ant-learn-python-concurrent/44e09209d38b458e1277e6a741ff530882435232/tmp/02. producer_consumer_craw.py -------------------------------------------------------------------------------- /tmp/06. thread_vs_process.py: -------------------------------------------------------------------------------- 1 | import math 2 | from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor 3 | 4 | PRIMES = [112272535095293] * 100 5 | 6 | import time 7 | 8 | 9 | def is_prime(n): 10 | if n < 2: 11 | return False 12 | if n == 2: 13 | return True 14 | if n % 2 == 0: 15 | return False 16 | sqrt_n = int(math.floor(math.sqrt(n))) 17 | for i in range(3, sqrt_n + 1, 2): 18 | if n % i == 0: 19 | return False 20 | return True 21 | 22 | 23 | def single_thread(): 24 | for number in PRIMES: 25 | is_prime(number) 26 | 27 | 28 | def multi_thread(): 29 | with ThreadPoolExecutor() as pool: 30 | pool.map(is_prime, PRIMES) 31 | 32 | 33 | def multi_process(): 34 | with ProcessPoolExecutor() as pool: 35 | pool.map(is_prime, PRIMES) 36 | 37 | 38 | if __name__ == "__main__": 39 | start = time.time() 40 | single_thread() 41 | end = time.time() 42 | print("single_thread, cost=", end - start, "seconds") 43 | 44 | start = time.time() 45 | multi_thread() 46 | end = time.time() 47 | print("multi_thread, cost=", end - start, "seconds") 48 | 49 | start = time.time() 50 | multi_process() 51 | end = time.time() 52 | print("multi_process, cost=", end - start, "seconds") 53 | -------------------------------------------------------------------------------- /tmp/blog_spider.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | urls = [ 4 | f"https://www.cnblogs.com/#p{page}" 5 | for page in range(1, 50 + 1) 6 | ] 7 | 8 | 9 | def craw(url): 10 | r = requests.get(url) 11 | print(url, len(r.text), r.status_code) 12 | 13 | 14 | craw(urls[2]) 15 | --------------------------------------------------------------------------------