python subprocess.Popen 运行多进程的 shell 写文件导致覆盖如何解决

2015-06-08 10:15:28 +08:00
 fxxkgw

Python2.6.6
shell脚本中使用多进程
for file in ${dir}*; do
{
cat $abc | grep "${def}" | awk -F'[ ,]+' -f $hij
}&
done
wait

fout=tempfile.TemporaryFile()
subprocess.Popen(args=self.cmd.encode('utf-8'), stdout=self.stdout, stderr=self.stderr, shell=True, cwd=self.cwd)
out=fout.read() #获取最终数据
awk中用printf输出过滤出的数据到self.stdout中,现在发现当起多个awk并行执行时,获取的数据有覆盖的情况,应该是同时写fout时没锁导致,但是Popen参数里没发现有控制的地方,请问如何处理呢?

2833 次点击
所在节点    Python
7 条回复
henryon
2015-06-08 10:47:30 +08:00
弱弱的问下,你的需求是什么? 方便贴下原数据,目标期望么?
guojinyun
2015-06-08 10:49:00 +08:00
我一般是把结果放到一个队列中,再来一个线程把队列中的内容写出.
fxxkgw
2015-06-08 11:06:57 +08:00
@henryon
由于原始的比较复杂些,我简单写了个例子
我先写了个python 然后运行shell 然后运行awk 内容如下:
test.py

import veasyprocess
import os

cmd = "sh writefile.sh"
PWD = os.getcwd()
#veasyprocess模块中使用的就是subprocess.Popen方法,只是封装了下面两行
#fout=tempfile.TemporaryFile()
#subprocess.Popen(args=self.cmd.encode('utf-8'), stdout=self.stdout, stderr=self.stderr, shell=True, cwd=self.cwd)

status, outs = veasyprocess.shell_2_tempfile(_cmd = cmd, _cwd = PWD, _timeout = 240)
print status
print outs
============================================
wirtefile.sh
for((i=0; i<10; i++)); do
{
awk -f error.awk writefile.sh
}&
done
wait

error.awk
END {
for(i=0; i<10000; i++) {
printf "hello world 11111 22222 33333 44444 55555 66666\n"
}
}
~
输出内容有下面这种
hello world 11111 22222 33333 44444 55555 66666
1 22222 33333 44444 55555 66666
hello world 11111 22222 33333 44444 55555 66666
hello world 11111 22222 33333 44444 55555 66666
hello world 11111 22222 33333 44hello world 11111 22222 33333 44444 55555 66666
hello world 11111 22222 33333 44444 55555 66666

输出的内容明显有覆盖现象,要达到的效果就是数据无覆盖,即每行都是完整的hello world 11111 22222 33333 44444 55555 66666
des
2015-06-08 11:12:01 +08:00
那为什么不直接用python处理呢?
fxxkgw
2015-06-08 11:15:18 +08:00
@des 嗯 数据量比较大,awk是C写的 速度比python快的多。
des
2015-06-08 11:20:54 +08:00
@fxxkgw 好像快不到哪里去吧……
hahastudio
2015-06-08 11:26:48 +08:00
-为什么不直接改 shell 脚本呢-

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/196846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX