中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]如何灵活的实现多进程处理?
作者:
标题: [讨论]如何灵活的实现多进程处理? 上一主题 | 下一主题
honghunter
中级用户





积分 321
发帖 135
注册 2007-2-4
状态 离线
『楼 主』:  [讨论]如何灵活的实现多进程处理?

下面的批处理是在本版看到的一个批处理文件的基础上修改的,

目的是用在需要下载多个文件的时候,能充分利用资源,使用多个进程来速度总的下载时间。

希望能通过类似这样的调用:
CALL %PUB_BATCH%\multi-process.bat %CACHE_DIR%\url.txt %BATCH_WS%\sub_get_book.bat 7
来达到这样的目的:
1,将url.txt中每行的url都下载下来
2,最多同事运行7个CMD进程

目前的问题:
在for执行到第8行的时候,如果前面7个都没有执行完(就是当前还有7个CMD进程),就会丢失对第8行的处理。

补充:sub_get_book.bat运行的时间的长短不一定,可能几秒结束,也可能要几分钟才能结束。
if "%3"=="" goto show_help

@ECHO OFF & SETLOCAL ENABLEDELAYEDEXPANSION

SET TMP_CACHE_FILE=%1

SET /a MaxCMD=%3

SET /a LineNo=1

SET SUB_AUTO_EXIT=1

for /f "delims=#" %%a in (%TMP_CACHE_FILE%) do (
        echo get line=%%a
  for /f "delims=:" %%i in ('tasklist /fi "IMAGENAME eq cmd.exe" /nh ^|findstr /n .*') do set "count=%%i"
  set /a count=!count!-2
  if !count! lss !MaxCMD! (
     start "!LineNo!" /min %2 %%a
     set /a LineNo=LineNo+1
     sleep 3s
        )

        @REM  echo sleep 3s in main batch.
  sleep 3s
)

goto :eof


:show_help
echo 缺少参数!
echo TMP_CACHE_FILE=%TMP_CACHE_FILE%
echo eg.: call multi-process.bat 需要循环处理的文件 被调用处理文件的子批处理文件 同时多少个CMD一起处理

goto :eof
需要处理的url.txt文件内容格式:
  tmp0 "http://vip.book.sina.com.cn/book/book_read.php?book=8743"
  tmp1 "http://vip.book.sina.com.cn/book/book_read.php?book=8161"
  tmp2 "http://vip.book.sina.com.cn/book/book_read.php?book=26705"
  tmp3 "http://vip.book.sina.com.cn/book/book_read.php?book=5667"
  tmp4 "http://vip.book.sina.com.cn/book/book_read.php?book=4973"
  tmp5 "http://vip.book.sina.com.cn/book/book_read.php?book=15050"
  tmp6 "http://vip.book.sina.com.cn/book/book_read.php?book=7700"




探讨批量下载与智能化的下载
2007-12-15 20:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gahoo
初级用户





积分 45
发帖 19
注册 2007-3-8
状态 离线
『第 2 楼』:  

献丑了
REM Nproc.cmd
REM Name为进程名称,Max为最大进程数,Interval为检测间隔时间
@echo off
SET Name=%1
SET Max=%2
SET Interval=%3
cls
for /f %%i in ('tasklist /fi "imagename eq %Name%" /nh ^|find "%Name%" /c') do echo 当前进程数为:%%i && if %%i GEQ %Max% ping -n %Interval% 127.1>nul && call Nproc %Name% %Max% %Interval%
[ Last edited by gahoo on 2007-12-16 at 02:27 AM ]

2007-12-16 02:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
honghunter
中级用户





积分 321
发帖 135
注册 2007-2-4
状态 离线
『第 3 楼』:  

谢谢,然我试试看效果。



探讨批量下载与智能化的下载
2007-12-16 19:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: