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参数里没发现有控制的地方,请问如何处理呢?
1
henryon 2015-06-08 10:47:30 +08:00
弱弱的问下,你的需求是什么? 方便贴下原数据,目标期望么?
|
2
guojinyun 2015-06-08 10:49:00 +08:00
我一般是把结果放到一个队列中,再来一个线程把队列中的内容写出.
|
3
fxxkgw OP @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 |
4
des 2015-06-08 11:12:01 +08:00
那为什么不直接用python处理呢?
|
7
hahastudio 2015-06-08 11:26:48 +08:00
-为什么不直接改 shell 脚本呢-
|