我正在使用Python 3和Discord.py API包装器(使用asyncio)编写discord bot . 我正在运行一个Web服务器来处理主线程中的Atom Feed Notifications和第二个线程中的discord客户端 .
我正在使用dill来保存自定义类的字典 . 当机器人收到包含有效命令的聊天消息(字典中的某些更改)时,该函数由discord客户端(线程2)运行 .
该脚本似乎陷入 dill.dump()
:
功能
def save_object(obj, filename):
f = open(filename, "wb")
print("Opened file.")
dill.dump(obj, f)
print("Dumped to file.")
f.close()
print("Closed file.")
return
def load_object(filename):
f = open(filename, "rb")
obj = dill.load(f)
f.close()
return obj
调用函数
...
print('Saving Streamers')
save_object(Streamers, "streamers.dat")
print('Saving Youtubers')
save_object(Youtubers, "youtubers.dat")
我意识到通过使用 with
块可以使代码看起来更好(并且可能工作效率更高),这仅仅是一个测试版本(因此也是打印语句的加载) . 我运行时收到的输出是:
Saving Streamers
Opened file.
***NOTHING ON THIS LINE***
我没有得到任何类型的错误消息,脚本只是停止在该行输出和冻结类型 .
该文件在文件资源管理器中可见,但包含0个字节 .
当我用 CTRL+C
强制退出脚本时,文件最终保存 .
当我在python3解释器中手动运行此代码片段时,它工作正常(从相同的工作目录,由于脚本由root运行,因此存在读写权限) .
1 回答
似乎问题是Global Interpreter Lock . 解决方案 - 对我来说 - 是切换到多处理而不是线程 .