我的python一次面试

小记

哪天早上,我起床,想了想还是不去面试了,原因有点简单想多休息下,所以就不去了, 于是我坐在电脑旁,回了一个邮件说工作不太适合,所以我不去了。于是我继续在电脑旁边写写代码, 大概10点左右,哪边HR打来问我原因,我不好意思拒绝,于是我就去了,慢慢吞吞,原来要1个半小时到哪里面试了, 结果要了2个小时,自已还不情愿进入去,去到哪里坐着,等等面试,心想快点搞完就走了。

结果面试官给我了一道题!

题目

运行一个转换文件格式的命令,把一个目录的文件转换到另一个目录上,要求使用多进程实现?

分析

我当时是想这样做的 运行一个进程把目录上文件生成出来,运行多个进程处理生成的文件,他们之间通信可以使用Queue, Event 多个进程则使用for 生成,然后等待。

但生成好像都要解决一个问题, 把路径搞成相对形式

计算目录间的相对路径

现在我想想这个方案,运行一个进程把目录上文件生成出来时间,应用不长,我可以放在原程序上做, 可以使用进程池实现,

一些思考

其实就是同时运行多条命令,我好像用错方向了,正确思考是同时运行多个命令!

实例


# -*- coding: utf-8 -*-
import os
import subprocess
from multiprocessing import Pool


def relpath(p1, p2, sep=os.path.sep):
    """p2 包含 p1!
    """
    x1 = p1.split(sep)
    if x1[-1] == '':
        del x1[-1]
    x2 = p2.split(sep)
    return sep.join(x2[len(x1):])


def path_pair(src_dir, dst_dir):
    for root, _, files in os.walk(src_dir):
        for f in files:
            p = os.path.join(root, f)
            yield (p, os.path.join(dst_dir, relpath(src_dir, p)))


def copy(argv):
    src, dst = argv
    if not os.path.isfile(src):
        return False
    try:
        os.makedirs(os.path.dirname(dst))
    except:
        pass
    subprocess.check_output(['/bin/cp', src, dst])


def main(argv):
    src = argv[1]
    dst = argv[2]
    count = int(argv[3])

    p = Pool(count)
    p.apply(copy, path_pair(src, dst))


if __name__ == '__main__':
    import sys
    main(sys.argv)


Loading Disqus comments...
Table of Contents