【问题标题】:Python - Calling Linux command from Thread Pool not workingPython - 从线程池调用 Linux 命令不起作用
【发布时间】:2011-11-03 17:00:05
【问题描述】:

--大家好,--

我有大约 4000 个 (1-50MB) 文件要排序。

我正在考虑让 Python 调用 Linux 排序命令。而且由于我认为这可能有点受 I/O 限制,所以我会使用线程库。

这就是我所拥有的,但是当我运行它并观察系统监视器时,我没有看到 25 个排序任务弹出。它似乎一次运行一个?我做错了什么?

...
print "starting sort"
def sort_unique(file_path):
    """Run linux sort -ug on a file"""
    out = commands.getoutput('sort -ug -o "%s" "%s"' % (file_path, file_path))
    assert not out

pool = ThreadPool(25)
for fn in os.listdir(target_dir):
    fp = os.path.join(target_dir,fn)
    pool.add_task(sort_unique, fp)

pool.wait_completion()

Here's where ThreadPool comes from,也许是坏了?

【问题讨论】:

    标签: python linux multithreading threadpool


    【解决方案1】:

    你做的一切都是正确的。

    在python中有一个叫做GIL的东西;
    全局解释器锁 - 最终导致 python 一次只执行一个线程。

    改为选择子进程 :),python 不是多线程的。

    【讨论】:

    • 我知道GIL,但是我认为应该在Linux命令运行时释放GIL,对吧?
    • 我不会这么说,但我也想听听其他人的确认。
    • 我同意bua,使用子进程。
    【解决方案2】:

    实际上,这似乎确实有效。我说得太早了。不知道你们是想删还是怎么的?对此感到抱歉。

    【讨论】:

      【解决方案3】:

      通常人们通过产生多个进程来做到这一点。 multiprocessing 模块使这很容易做到。

      另一方面,Python 非常擅长排序,所以为什么不直接将文件读入字符串列表file.readlines(),然后在 Python 中对其进行排序。您必须编写一个 key 函数以与 list.sort() 一起使用来执行 -g 选项,并且您还必须删除重复项,即 -u 选项。删除重复项的最简单方法(也是快速方法)是在进行排序之前执行list(set(UNsortedfile))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        • 2023-03-08
        • 2022-10-19
        • 2015-12-26
        • 1970-01-01
        相关资源
        最近更新 更多