คำสั่งแบตช์ Windows แบบมัลติเธรด


10

คุณรู้หรือไม่ว่ามีวิธีง่าย ๆ ในการเรียกใช้ สำหรับ คำสั่งในไฟล์แบทช์ในหลายกระทู้? อะไรคือจุดของการมี 4 คอร์หากฉันไม่สามารถทำงานของฉันใน 4 เธรดแบบขนานได้

ตัวอย่างเช่นถ้าฉันปรับ PNG ให้เหมาะสมด้วย PNGOUT คำสั่งที่ฉันจะใช้คือ

for %i in (*.png) do pngout "%i"

แต่นี่เป็นงานที่ต้องปรับค่าได้สูงซึ่งงานย่อยไม่ได้พึ่งพาซึ่งกันและกันเลย

เมื่อต้องการเรียกใช้ใน 4 'คิว' ฉันต้องการเขียน

for -thread 4 %i in (*.png) do pngout "%i"

ฉันจำเป็นต้องเขียนแอพที่คล้ายกันของตัวเองหรือไม่ที่จะสามารถทำได้หรือมีวิธีแก้ปัญหาฟรี


ตรวจสอบคำตอบต่อไปนี้เพื่อใช้เครื่องมือภายนอก: [ stackoverflow.com/a/12041213/365229][1] [1]: stackoverflow.com/a/12041213/365229
ray pixar

คำตอบ:


12

ฉันได้เขียนไฟล์แบตช์ที่ดำเนินการคำสั่งเพียงจำนวนสูงสุดในขณะที่ผ่านมาใน Stack Overflow: การประมวลผลแบบขนานของกระบวนการเชลล์ :

@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof

:loop
call :checkinstances
if %INSTANCES% LSS 5 (
    rem just a dummy program that waits instead of doing useful stuff
    rem but suffices for now
    echo Starting processing instance for %1
    start /min wait.exe 5 sec
    goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof

:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof

มันวางไข่สูงสุดสี่กระบวนการใหม่ที่ดำเนินการในแบบคู่ขนานและย่อเล็กสุด อาจต้องปรับเวลารอขึ้นอยู่กับว่าแต่ละกระบวนการทำงานอย่างไรและใช้เวลานานเท่าใด คุณอาจต้องปรับชื่อกระบวนการที่รายการงานกำลังมองหาหากคุณกำลังทำอย่างอื่นอยู่

แม้ว่าจะไม่มีวิธีที่จะนับกระบวนการที่ถูกวางโดยชุดนี้ได้อย่างเหมาะสม วิธีหนึ่งคือการสร้างตัวเลขสุ่มที่จุดเริ่มต้นของแบทช์ ( %RANDOM% ) และสร้างแบตช์ผู้ช่วยที่ทำการประมวลผล (หรือวางโปรแกรมการประมวลผล) แต่สามารถตั้งชื่อหน้าต่างเป็นพารามิเตอร์:

@echo off
title %1
"%2" "%3"

นี่จะเป็นชุดที่เรียบง่ายที่ตั้งชื่อเป็นพารามิเตอร์แรกแล้วเรียกใช้พารามิเตอร์ที่สองกับที่สามเป็นอาร์กิวเมนต์ จากนั้นคุณสามารถกรองในรายการงานโดยเลือกเฉพาะกระบวนการที่มีชื่อหน้าต่างที่ระบุ ( tasklist /fi "windowtitle eq ..." ) สิ่งนี้ควรทำงานได้อย่างน่าเชื่อถือและป้องกันไม่ให้เกิดผลบวกที่ผิด ค้นหา cmd.exe จะเป็นความคิดที่ไม่ดีถ้าคุณยังมีอินสแตนซ์ที่ทำงานอยู่ซึ่งจะ จำกัด กระบวนการทำงานของคุณ

คุณสามารถใช้ได้ %NUMBER_OF_PROCESSORS% เพื่อสร้างค่าเริ่มต้นที่เหมาะสมของจำนวนอินสแตนซ์ที่จะวางไข่

คุณยังสามารถดัดแปลงสิ่งนี้เพื่อใช้งาน psexec เพื่อวางไข่กระบวนการจากระยะไกล (แต่จะไม่ทำงานได้มากเพราะคุณต้องมีสิทธิ์ผู้ดูแลระบบในเครื่องอื่น ๆ เช่นเดียวกับรหัสผ่านในแบทช์) คุณจะต้องใช้ชื่อกระบวนการสำหรับการกรองแล้ว


นี่เป็นเวทย์มนตร์แบล็กที่ร้ายแรง! ฉันหวังว่าฉันจะโหวตได้มากขึ้น!
Axarydax

ไม่นั่นเป็นสิ่งที่ค่อนข้างพื้นฐานเมื่อคุณได้รับมัน ;-)
Joey

คำสั่ง 'wc' ไม่พร้อมใช้งานในบรรทัดคำสั่ง Win10 ของฉัน ฉันจะใช้อะไรได้อีก
PeterCo

1
@PeterCo: find /c /v "".
Joey

1

ไฟล์แบตช์มีไว้สำหรับการเขียนสคริปต์ขั้นพื้นฐานอย่างยิ่งและไม่สนับสนุนการใช้มัลติเธรดชนิดใด ๆ คุณจะต้องเขียนโปรแกรมอรรถประโยชน์ของคุณเองเพื่อทำสิ่งที่คุณต้องการจะทำให้สำเร็จ

อีกวิธีหนึ่งคือ Windows PowerShell อาจให้ความสามารถมากขึ้นเพื่อให้คุณเข้าใกล้เป้าหมายมากขึ้น

หากคุณต้องการรันการดำเนินการหลายอย่างพร้อมกันคุณสามารถใช้คำสั่ง เริ่มต้น เพื่อเปิดยูทิลิตี PNGOUT ในหน้าต่างใหม่ วงวน FOR จะดำเนินการต่อโดยไม่รอให้การดำเนินการแต่ละครั้งเสร็จ

บรรทัดที่แก้ไขจะมีลักษณะดังนี้:

for %i in (*.png) do start pngout "%i"

อย่างไรก็ตามโปรดทราบว่าสิ่งนี้จะเปิดตัว PNGOUT อย่างมีประสิทธิภาพ ทั้งหมด ไฟล์ในไดเรกทอรีในเวลาเดียวกันซึ่งเป็นไปได้มากว่าไม่เป็นที่ต้องการ


นี่เป็นวิธีการที่ไร้เดียงสาและอย่างที่คุณพูดถึงอาจไม่เป็นที่ต้องการ คุณต้องการเปิดใช้งานกระบวนการมากเท่าที่คุณมีแกน หากคุณมี 4 คอร์และ 1,000 ไฟล์คุณต้องการประมวลผลครั้งละ 4 คอร์เท่านั้นจนกว่าจะประมวลผล 1,000 รายการทั้งหมด หากคุณพยายามประมวลผล 1,000 ทั้งหมดในครั้งเดียวใน 4 คอร์คอมพิวเตอร์ของคุณจะช้าลงในการรวบรวมข้อมูลที่ไร้ประโยชน์
Adisak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.