Linux Time 命令导致多上下文 with 语句异常

Posted

技术标签:

【中文标题】Linux Time 命令导致多上下文 with 语句异常【英文标题】:Linux Time Command causes Exception for Multi-context With Statement 【发布时间】:2014-08-18 17:11:33 【问题描述】:

背景

我正在使用 Python 2.7.6 与 multiprocessing 模块并行解析大块文件(20+ GB)。我让工作进程从输入文件中提取信息并将结果放在搁置的字典中以供以后处理。为了防止同时写入伪数据库,我使用了托管锁。我还为数据库访问实现了一个上下文管理器,以确保它始终处于关闭状态,因为 shelve 模块在 Python 3.4 之前并不原生支持上下文管理器功能。

问题

我想用 Linux time 命令测量整体运行时间。但是,当我使用 time 命令运行脚本时,我得到一个 SyntaxError 异常,如果我正常运行它,我 不会 得到它。示例代码:

import multiprocessing
import shelve
from contextlib import contextmanager

DB_NAME = 'temp_db'

# manually implemented context manager - not natively implemented until Python 3.4
# I could use contextlib.closing, but this method makes the "with" statements cleaner
@contextmanager
def open_db(db_name, flag='c'):
    db = shelve.open(db_name, flag=flag)
    try:
        yield db
    finally:
        db.close()

db_lock = multiprocessing.Manager().Lock()

with db_lock, open_db(DB_NAME) as db:
    db['1'] = 'test_value1'
    db['2'] = 1.5

with db_lock, open_db(DB_NAME) as db:
    for key, val in db.iteritems():
        print("0 : 1\n".format(key, val))

运行 python test_script.py 会产生预期的输出:

2 : 1.5

1 : test_value1

另一方面,运行time python test_script.py 会导致异常:

  文件“test_script.py”,第 21 行 使用 db_lock,open_db(DB_NAME) 作为 db: ^ SyntaxError: 无效语法 0.005u 0.002s 0:00.01 0.0%      0+0k 0+0io 0pf+0w

问题

为什么 time 命令会影响解释器认为有效的语法?

其他说明

    我假设 time 命令被正确调用,因为它确实产生了计时信息,并且异常的存在表明解释器正在寻找正确的脚本。 如果我消除获取锁数据库打开,异常消失,所以问题似乎是由with语句中的逗号引起的。

【问题讨论】:

【参考方案1】:

某些原因导致python 可执行文件(和版本)发生更改。试试这些命令:

which python
python -V

time which python
time python -V

对于整个项目,考虑让每个工作人员只将数据返回给父级,然后将信息存储在文件或数据库中。这简化了代码,因为您不需要锁定——只有父级可以访问。

【讨论】:

好电话,我的好先生。我的 shell 将 python 命令别名为 Python 2.7.6 的网络安装,而 time 命令在 Python 2.6 的本地安装上执行脚本,这不允许使用一个 with 语句输入多个上下文。

以上是关于Linux Time 命令导致多上下文 with 语句异常的主要内容,如果未能解决你的问题,请参考以下文章

Linux性能分析-CPU上下文切换

jmeter测试接口-打开很多TCP的连接数TIME_WAIT状态(Linux环境)导致报错的解决方法

QGIS 是不是支持 WMS-T(WMS with time)?

使用linux命令以秒为单位获取墙上时间?

play with snake on linux

多处理返回“打开的文件太多”,但使用 `with...as` 修复它。为啥?