Python脚本卡在dill.dump()

时间:2017-04-09 18:21:54

标签: python multithreading python-3.x pickle dill

我正在使用Python 3和Discord.py API包装器(使用asyncio)编写discord bot。我正在运行一个Web服务器来处理主线程中的Atom Feed Notifications和第二个线程中的di​​scord客户端。

我正在使用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 个答案:

答案 0 :(得分:0)

似乎问题是Global Interpreter Lock。解决方案 - 对我来说 - 是切换到多处理而不是线程。