解决 pymongo 在linux 的子进程中操作父进程的链接报错,MongoClient opened before fork. Create MongoClient only after forking.
linux上不能在子进程中操作全局变量client的链接,否则报错。需要说明的是win的多进程不是fork实现的,所以子进程操作client没事
封装1个get_col的函数就行了。判断pid。
1 import os 2 from multiprocessing import Process 3 4 import pymongo.collection 5 from auto_run_on_remote import run_current_script_on_remote 6 from pymongo import MongoClient 7 8 run_current_script_on_remote() 9 10 cleint = MongoClient(host='127.0.0.1') 11 12 13 pid__col_map = {} 14 15 def get_col(db:str,col:str,mongo_connect_url='mongodb://127.0.0.1') ->pymongo.collection.Collection: 16 pid = os.getpid() 17 key = (pid,mongo_connect_url,db,col) 18 if key not in pid__col_map: 19 pid__col_map[key] = MongoClient(mongo_connect_url).get_database(db).get_collection(col) 20 return pid__col_map[key] 21 22 23 def col3() ->pymongo.collection.Collection: 24 return get_col('testdb', 'col3') 25 26 def f(): 27 # cleint.get_database('testdb').get_collection('testcol').insert_one({"a":1}) # 如果在子进程中运行这个函数,这个在linux + pymongo 4.xx报错,在3.xx会警告。 28 # get_col('testdb','testcol2').insert_one({"a":1}) 29 col3().insert_one({"b": 2}) 30 31 32 if __name__ == '__main__': 33 [Process(target=f).start() for i in range(3)]
反对极端面向过程编程思维方式,喜欢面向对象和设计模式的解读,喜欢对比极端面向过程编程和oop编程消耗代码代码行数的区别和原因。致力于使用oop和36种设计模式写出最高可复用的框架级代码和使用最少的代码行数完成任务,致力于使用oop和设计模式来使部分代码减少90%行,使绝大部分py文件最低减少50%-80%行的写法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!