Board logo

标题: [文件操作] 批处理怎样实现多进程环境下的文件读写? [打印本页]

作者: 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

  1. @echo off
  2. (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://www.bathome.net/) Powered by Discuz! 7.2