Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件和多处理器_Windows_Multithreading_Batch File_Multiprocessing - Fatal编程技术网

Windows批处理文件和多处理器

Windows批处理文件和多处理器,windows,multithreading,batch-file,multiprocessing,Windows,Multithreading,Batch File,Multiprocessing,我有一个Windows批处理文件,除了在多个文件上,它多次执行相同的操作。我有没有办法告诉计算机使用不同的处理器核来加速进程?否则,由于始终使用同一个处理器,因此需要更长的时间 在windows批处理文件中,可以对管道或start/b使用多线程处理 像这样的东西应该有用 @echo off setlocal EnableDelayedExpansion set "file1=%~1" :startExtraThread if NOT "%~2"=="" ( start "Thread fo

我有一个Windows批处理文件,除了在多个文件上,它多次执行相同的操作。我有没有办法告诉计算机使用不同的处理器核来加速进程?否则,由于始终使用同一个处理器,因此需要更长的时间

在windows批处理文件中,可以对管道或
start/b
使用多线程处理

像这样的东西应该有用

@echo off
setlocal EnableDelayedExpansion
set "file1=%~1"

:startExtraThread
if NOT "%~2"=="" (
  start "Thread for %~2" /b "cmd /c %~f0 %~2"
  shift
  goto :startExtraThread
)

do my job with file1

尽管批处理文件可以启动多个并行线程,但在同步所有线程时存在多个问题。通常的synchro方法使用类似于信号量的文件,但是检查信号量文件的代码浪费了CPU时间。虽然可以在代码中插入延迟,但结果通常是麻烦和棘手的

我为批处理文件开发了一个高效的多线程方案,该方案使用管道获取同步信号;这一点允许等待代码不浪费CPU时间,因此所有CPU内核都可以用于数据处理。下面的程序是一个处理通配符选择的多个文件的示例,但是该代码可以很容易地适用于处理任何其他数据集;此方法专门针对只有一个线程同时结束其处理的情况而设计,如果两个或多个文件的处理在很短的时间间隔内结束,则可能会失败

@echo off
setlocal EnableDelayedExpansion

rem Multi-thread scheme in Batch files
rem Antonio Perez Ayala aka Aacini

set "myID=%~2"
if "%~1" neq "" goto %1

set "signal=X"
for /L %%i in (1,1,10) do set "signal=!signal!!signal!"

rem Create the list of start commands for the concurrent working threads
set "numThreads=%NUMBER_OF_PROCESSORS%"
set "threads="
del availableThread* 2> NUL
for /L %%i in (1,1,%numThreads%) do (
   set "threads=!threads! & start "" /B cmd /C "%~NX0" Thread %%i"
   > availableThread%%i echo %%i
)

echo Start of application
del requestForThread* 2> NUL
( %threads:~3% ) | "%~NX0" Main
echo End of application
goto :EOF


:Main

echo Main - started

rem Controlling code: process all files and assign each one to available threads
for /F "delims=" %%f in ('dir /A-D /B *.txt') do (

   rem Get the number of next available thread; waits for anyone, if necessary
   if not exist availableThread* (
      echo X > mainIsWaiting
      echo Main - waiting for an available thread
      set /P availableSignal=
      del mainIsWaiting
   )

   set "nextThread="
   for %%t in (availableThread*) do if not defined nextThread (
      set /P "nextThread=" < %%t
      del %%t
   )

   if not defined nextThread (
      echo SYNCHRO FAILED^^!
      goto waitThreadsEnds
   )

   rem Assign the next file to the available thread
   echo %%f> requestForThread!nextThread!
   echo Main - file "%%f" assigned to thread #!nextThread!

)

echo Main - all files sent to processing

rem Wait until all threads ends their tasks
:waitThreadsEnds
   set availableThreads=0
   for %%t in (availableThread*) do set /A availableThreads+=1
if %availableThreads% lss %numThreads% goto :waitThreadsEnds
del availableThread*

rem Send "exit" signals to all threads
for /L %%i in (1,1,%numThreads%) do echo exit> requestForThread%%i
echo Main - end
goto :EOF


:Thread

rem Wait until a request for this thread appear
if not exist requestForThread%myID% goto Thread
set "request="
set /P "request=" < requestForThread%myID%
if not defined request goto Thread
del requestForThread%myID%
if "%request%" equ "exit" goto :EOF

rem Process the file
echo %time% - Thread #%myID% start: "%request%" > CON
set /A seconds=6+%random:~-1%
ping localhost -n %seconds% > NUL
echo %time% - Thread #%myID% end:   "%request%" > CON

rem Inform that this thread is available for other task
> availableThread%myID% echo %myID%
if exist mainIsWaiting echo %signal:~0,1021%

goto Thread
@echo关闭
setlocal EnableDelayedExpansion
批处理文件中的rem多线程方案
雷姆·安东尼奥·佩雷斯·阿亚拉又名阿奇尼
设置“myID=%~2”
如果“%~1”neq“转到%1”
设置“信号=X”
对于(1,1,10)中的/L%%i,请设置“信号=!信号!!信号!”
rem为并发工作线程创建启动命令列表
设置“numThreads=%numberofpu处理器%”
设置“线程=”
del availableThread*2>NUL
对于(1,1,%numThreads%)中的/L%%i,请执行以下操作(
设置“threads=!threads!&start”“/B cmd/C”%~NX0“Thread%%i”
>可用读取%%i echo%%i
)
echo启动应用程序
del requestForThread*2>NUL
(%线程:~3%)|“%~NX0”主线程
回显应用程序结束
后藤:EOF
:Main
回音主-已启动
rem控制代码:处理所有文件并将每个文件分配给可用线程
对于/F“delims=“%%F in('dir/A-D/B*.txt')do(
rem获取下一个可用线程的数量;如果需要,等待任何人
如果不存在,请读取*(
echo X>Main正在等待
echo Main-等待可用线程
设置/P可用信号=
德梅因正在等待
)
设置“nexthread=”
对于%%t in(availableThread*),如果未定义,请执行下一个线程(
设置/P“nexthread=”<%%t
德尔%%t
)
如果未定义nexthread(
回音同步失败^^!
后藤等待
)
rem将下一个文件分配给可用线程
echo%%f>requestForThread!下一个线程!
echo Main-已将文件“%%f”分配给线程#!nexthread!
)
echo Main-发送到处理的所有文件
rem等待所有线程结束其任务
:waitThreadsEnds
设置availableThreads=0
对于%%t in(availableThread*),请设置/A availableThreads+=1
如果%availableThreads%lss%numThreads%goto:waitThreadsEnds
del availableThread*
rem向所有线程发送“退出”信号
对于(1,1,%numThreads%)中的/L%%i,执行echo exit>requestForThread%%i
回音主端
后藤:EOF
:线程
rem等待,直到出现对此线程的请求
如果不存在requestForThread%myID%goto Thread
设置“请求=”
设置/P“request=“NUL
echo%time%-线程#%myID%end:“%request%”CON
rem通知此线程可用于其他任务
>availableThread%myID%echo%myID%
如果存在main正在等待回波%信号:~01021%
转到线程
当然,为了使此方法按预期工作,您的Windows计算机必须仅处理此批处理文件,而不进行其他并发处理


有关此解决方案中使用的方法的进一步解释,请参阅。

应在SU上询问,但可能在那里作为dup关闭。
DOS
不支持多个处理器。如果您谈论的是Windows命令行批处理文件,那么使用
start/affinity
,这里有很多示例。无论如何,它不会加快任何速度,因为Windows会自动使用额外的处理器。可能的副本您可以假装您的计算机运行的是正确的操作系统,并使用GNU并行。。。超级黑客的方式,在紧要关头做这件事,分裂你的文件和运行多个实例,你的蝙蝠对他们。我相信我会在下一篇评论中听到这有多糟糕。假设我有一个程序myboxer.exe和一个文件block_base.dat。也就是说,程序将文件从一种格式转换为另一种格式。在这种情况下,代码看起来如何?