Python-从线程池调用Linux命令无效
--大家好-- 我有大约4000(1-50MB)的文件要排序 我想让Python调用Linux排序命令。由于我认为这可能有点I/O限制,所以我会使用线程库 所以这里是我所拥有的,但是当我运行它并观看系统监视器时,我没有看到25个排序任务弹出。它似乎一次运行一个?我做错了什么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.
...
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。