python的时间库不是线程安全的

作者: | 更新日期:

震惊,多线程程序竟然在时间函数哪里挂了。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

大家好,这里是tiankonguse的公众号(tiankonguse-code)。
tiankonguse曾是一名ACMer,现在是鹅厂视频部门的后台开发。
这里主要记录算法,数学,计算机技术等好玩的东西。

这篇文章从公众号tiankonguse-code自动同步过来。
如果转载请加上署名:公众号tiankonguse-code,并附上公众号二维码,谢谢。

零、背景

前端时间写了多线程程序,最终发现在调用time.strptime函数时偶尔抛出异常,是的,偶尔抛异常.
多线程下偶尔发生的问题显然是线程安全问题了.

一、分析

先看看代码, 开个线程, 线程里对时间进行计算.

import time
import thread

def f():
    for m in xrange(1, 13):
        for d in xrange(1,29):
            time.strptime("2010%02d%02d"%(m,d),"%Y%m%d")

for _ in xrange(10):
    thread.start_new_thread(f, ())

> Traceback (most recent call last):
>   File "[...]/test.py", line 75, in f
>     time.strptime("2010%02d%02d"%(m,d),"%Y%m%d")
> AttributeError: _strptime_time

查询python文档, 发现不是线程安全的.

Thread safety: The use of strptime is thread safe, but with one important caveat.  The first use of strptime is not thread safe because the first use will import _strptime.  That import is not thread safe and may throw AttributeError or ImportError.  To avoid this issue, import _strptime explicitly before starting threads, or call strptime once before starting threads.

具体的说time.strptime自身是线程安全的, 但是time.strptime依赖其他库, 其他库使用时才会进行import,而import操作不是线程安全的.

解决方案也就简单了,在多线程之前手动调用一下time.strptime即可.
当然,也可以手动的显示引入依赖库import _strptime.

八、总结

python已经是这么成熟的语言了,但是time.strptime的文档上一直都没有提这个函数是非线程安全的,悲剧呀。

对了现在开通了公众号和小密圈。
博客记录所有内容。
技术含量最高的文章放在公众号发布。
比较好玩的算法放在小密圈发布。
欢迎大家加入看各种算法的思路。

长按图片关注公众号,阅读不一样的技术文章。

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越