Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-从线程池调用Linux命令无效_Python_Linux_Multithreading_Threadpool - Fatal编程技术网

Python-从线程池调用Linux命令无效

Python-从线程池调用Linux命令无效,python,linux,multithreading,threadpool,Python,Linux,Multithreading,Threadpool,--大家好-- 我有大约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.

--大家好--

我有大约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()

,也许是坏了?

你做的一切都是正确的

有一种东西在python中被称为
全局解释器锁-最终导致python一次只执行一个线程


选择subprocess:),python不是多线程的

事实上,这似乎确实有效。我说得太快了。我不确定你们是想删除这个还是什么?对此很抱歉。

通常人们通过生成多个进程来实现这一点。
多处理
模块使此操作变得简单


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

我知道GIL,但我认为应该在Linux命令运行时释放GIL,对吗?我不会这么说,但我也希望听到其他人的确认。我同意bua,使用subprocess。