我的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)