标题: [文件操作] 批处理怎样实现多进程环境下的文件读写? [打印本页]
作者: qzwqzw 时间: 2009-8-24 21:55 标题: 批处理怎样实现多进程环境下的文件读写?
主要是想解决多进程环境下的日志读写时,如何避免“另一个程序正在使用此文件,进程无法访问”的错误。
因为使用了start启用多进程执行已提高程序运行效率,在访问到日志文件时,不可避免的遇到文件某一进程被占用,而其它进程无法读写的问题。
目前我的思路是:
任务进程不打开任何文件句柄
只向标准设备读写
而由调度进程去打开文件句柄
再将标准I/O重定向到指定文件中
调度.cmd
---------
(for /l %%i in (1,1,100) do (start /b "" 任务.cmd %%i )) >> 结果.log
任务.cmd
---------
echo.%date% %time% Process %1 end.
但缺点是只能输出一个LOG,如果有选择性根据命令类别输出多个LOG则仍有问题。
想知道各位在遇到此问题时有何妙策?
[ 本帖最后由 qzwqzw 于 2009-8-24 22:12 编辑 ]
作者: zqz0012005 时间: 2009-8-24 22:20
- @echo off
- (for /l %%i in (1,1,100) do start /b cmd /d /c任务.cmd %%i)>result.log
复制代码
作者: qzwqzw 时间: 2009-8-24 22:54
能解决多个LOG的问题吗
作者: zqz0012005 时间: 2009-8-24 23:23
“有选择性根据命令类别输出多个LOG”
怎样选择呢?根据什么命令类别?
这样吗? for /l %%i in (1,1,100) do start /b cmd /d /c任务.cmd %%i>result%%i.log
作者: qzwqzw 时间: 2009-8-24 23:29
比如在“任务.cmd”中
所有的echo命令输出到echo.log
所有的find目录输出到find.log
作者: zqz0012005 时间: 2009-8-25 00:04
如果只有两个命令产生输出且没有错误发生,可以将其中一个的输出定向到标准错误输出。
eg, task.cmd
echo hello 1>&2
find bathome a.txt
(for %%a in (1 2) do start /b cmd /ca.bat %%a)>find.txt 2>echo.txt
作者: qzwqzw 时间: 2009-8-25 01:11
倒是一种不错思路
延伸一下
如果有多个LOG
可以使用未定义句柄3-9
不过很可惜
echo hello 1>&3
用法是有问题的
在句柄3没有定义之前
是不能被指向的
作者: CrLf 时间: 2011-5-24 20:27
还是不太明白,下面这个为什么没有效果呢?
dir /b 3>con 1>&3 1>nul
将句柄1的输出改到句柄3,如果可行的话,就可以“双线”输出了,但是不能理解为什么不成功
作者: qzwqzw 时间: 2011-5-24 21:21
你的语句这样理解
1、将con赋给句柄3
2、将句柄3复制给句柄1
3、将nul赋给句柄1
结果是句柄1为nul,句柄3为con
因为dir命令没有使用句柄3输出
所以最终命令无任何输出
作者: plp626 时间: 2011-5-24 21:25
信号灯,PV操作。。
http://baike.baidu.com/view/703687.htm
作者: CrLf 时间: 2011-5-24 22:03
10楼,为什么你们什么都知道...
回qzw,好吧,我理解错了。那句柄3~9除了这么诡异的用途以外,到底有什么实际作用呢?
作者: qzwqzw 时间: 2011-5-24 22:06
在那个case里使用了类似信号灯的原理
所有的任务输出全部通过调度程序输出
多个任务同时输出时形成调度队列
在调度程序中使用一个标志文件做“信号灯”
A任务首先正常运行则开启信号灯-P操作
(创建标志文件)
B、C等任务在信号灯开启时被阻塞
(B、C等循环检查标志文件,存在则延迟随机毫秒数后继续检查)
A任务输出完成后关闭信号灯-V操作
(A删除标志文件)
B任务在信号灯关闭时首先运行并开启信号灯
(B首先检查到标志文件不存在则跳出循环,并重新建立标志文件)
C等任务在信号灯开启时被阻塞
如此循环往复
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |