我在python&中编写了一个程序它很棒,
它读取具有特定扩展名的文件名,搜索网络上的数据库&将它们重命名为新名称
但它太慢了。它一次为一个文件执行此任务,
如何让它为多个文件执行读取 - 重命名操作,一次说3个或4个文件?它与哪个主题有关?并行编程?
我希望我使用正确的术语,即在“并行”中执行任务。
答案 0 :(得分:1)
有时候使用gnu并行更容易,我写了很多类似的代码:
ls | parallel -j 4 ./pythonScript {}
这会接受任何输入并将其放在{}所在的位置。 (如前所述,在进行并行操作时必须小心,可以使用-j int来指定最大值。)
对于日期,我使用类似的东西:
seconds_in_a_day=$(( 24 * 60 * 60 ))
startDay=$(( `date --date="7/27/2013" +%s`))
finishDay=$(( `date --date="7/29/2013" +%s` ))
seq $startDay $seconds_in_a_day $finishDay | parallel -j 4 ./scirptThatRunsWithATimestamp {} ">"{}.txt
这将写入一个文件,其中包含timestamp.txt作为名称。
Parallel在处理取消和暂停作业方面做得非常出色,可以更轻松地在多台计算机上运行作业。此外,如果您学习如何使用它,您可以用任何语言编写并行代码或使用线性代码并轻松修改它。
答案 1 :(得分:0)
您可以使用python标准库中的多处理模块来并行化您的工作。多个I / O绑定进程可能会降低系统速度,因此请注意您的限制。
答案 2 :(得分:0)
多处理是一种选择,但由于您的瓶颈可能是网络访问,我建议您使用线程。在线程之间共享数据要比在进程之间更容易。创建的线程可以并行化慢速io任务。
看一下Python线程库,请记住,虽然引入任何需要您共享数据的并行性会使您的程序数量级难以理解和调试。
答案 3 :(得分:0)
由于您描述的所有工作都是I / O绑定,因此您可以考虑使用Python threading module来实现它。你可以创建三个线程。第一个将读取感兴趣的目录并识别候选文件。第二个线程将执行数据库查询,第三个线程将执行文件重命名,线程将与threading.Queue队列连接。
当第一个线程识别出一个文件时,它会通过队列将文件名传递给数据库查询线程。当数据库查询线程完成并且确定了新文件名时,将此数据传递到连接这些进程的队列上的文件重命名线程。
当标识文件的第一个线程没有更多工作要做时,整个过程终止,并向数据库查询线程发送一个Sentinel消息,可能是None
对象,然后终止。数据库查询线程将消息转发到文件重命名线程,然后自行终止。最后,当文件重命名线程收到sentinel时,它会自行终止。