【发布时间】:2014-07-11 21:24:18
【问题描述】:
我有一个正在测试处理服务器的 python 脚本。上传完成后,上传的文件会被重命名,以表明它们已准备好进行处理。为了测试繁重的负载,我使脚本成为多线程的,但是当我查看服务器上的上传目录时,一次只有一个文件进入。以下是相关代码:
def worker(queue):
while queue.qsize():
try:
infile, filename = queue.get()
except Queue.Empty:
return
size = os.path.getsize(infile)
copyStart = time.time()
print '{}: {} started'.format(time.asctime(), filename)
os.system('ssh servername "cat > {0} && mv {0} {1}" < {2}'.format(filename, filename.replace('upl', 'jpg'), infile))
print '{}: {} took {} secs for {} bytes'.format(time.asctime(), filename, time.time() - copyStart, size)
q = Queue.Queue()
for media_type, num in config.get("media").items():
media_dir = media_dir_format.format(media_type)
print '\nLoading media from ' + media_dir
itemId = startId
for i in range(num):
infile = media_dir + random.choice([x for x in os.listdir(media_dir) if x[-3:].lower() == 'jpg'])
filename = output_format.format(itemId, media_type[:-1])
q.put((infile, filename))
itemId += 1
threads = []
for i in range(config.get("threads")):
t = threading.Thread(target=worker, args=(q, ))
t.start()
threads.append(t)
所以基本上我用随机选择的输入文件和格式正确的输出名称之间的映射填充一个队列,然后启动,但是在测试配置文件中指定了许多线程。问题是即使 os.system 调用在相似的时间执行,上传只是一个接一个地发生,从脚本输出可以看出:
Fri Jul 11 17:06:44 2014: /bla/foo/b1.upl started
Fri Jul 11 17:06:44 2014: /blah/foo/b2.upl started
Fri Jul 11 17:06:44 2014: /blah/foo/b3.upl started
Fri Jul 11 17:07:03 2014: /blah/foo/b1.upl took 19.0852029324 secs for 8947009 bytes
Fri Jul 11 17:07:03 2014: /blah/foo/b4.upl started
Fri Jul 11 17:07:21 2014: /blah/foo/b3.upl took 36.8071010113 secs for 8348547 bytes
Fri Jul 11 17:07:21 2014: /blah/foo/b5.upl started
Fri Jul 11 17:07:40 2014: /blah/foo/b2.upl took 55.855271101 secs for 8348547 bytes
这只是一点点,但您可以看到连续上传需要的时间越来越长。我发现很难相信这是一个ssh 问题,因为我可以一次将 ssh 放入多个 shell 中而不会出现问题,并且稍微搜索一下就可以看到很多人同时在多个线程中使用os.system 的例子,所以瓶颈在哪里?
【问题讨论】:
-
你可以用上行速度慢来解释。所有 3 个文件并行启动 - 无论出于何种原因,一个文件完成得更快,但会立即开始另一个上传,仍然会消耗带宽。仅使用 3 个文件重试,看看其他数字是否有所改善。
-
我也有类似的经历,只上传了三个文件。
标签: python multithreading ssh os.system