মাল্টিথ্রেডেড উইন্ডোজ ফর ব্যাচ কমান্ড


11

আপনি কি জানেন যে একাধিক থ্রেডে ব্যাচ ফাইলে ফর কমান্ড চালানোর কোনও সহজ উপায় আছে ? আমি যদি 4 টি সমান্তরাল থ্রেডগুলিতে আমার কাজগুলি পরিচালনা করতে না পারি তবে 4 টি কোর থাকার বিষয়টি কী?

উদাহরণস্বরূপ, আমি যদি পিএনজিইউটি দিয়ে পিএনজিগুলিকে অপ্টিমাইজ করছি তবে কমান্ডটি আমি ব্যবহার করব

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

তবে এটি অত্যন্ত প্যারালাইলাইজেবল টাস্ক যেখানে সাব-টাস্ক একে অপরের উপর নির্ভর করে না।

এটিকে 4 'কাতারে' চালাতে আমি এমন কিছু লিখতাম

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

আমার কি নিজের পছন্দ মতো অ্যাপ্লিকেশন লিখতে হবে যা এটি করতে সক্ষম হবে বা কোনও বিনামূল্যে সমাধান পাওয়া যায়?


বহিরাগত টুল ব্যবহার করে folowing উত্তর চেক: [ stackoverflow.com/a/12041213/365229][1] [1]: stackoverflow.com/a/12041213/365229
Behrouz.M

উত্তর:


13

আমি একটি ব্যাচ ফাইল লিখেছি যা স্ট্যাক ওভারফ্লো: শেল প্রসেসের সমান্তরাল সম্পাদন : কিছুক্ষণ আগে কেবলমাত্র সর্বোচ্চ সংখ্যক কমান্ড কার্যকর করে :

@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প্রক্রিয়াগুলি দূরবর্তীভাবে ছড়িয়ে দেওয়ার জন্য আপনি সহজেই এটিকে মানিয়ে নিতে পারেন (তবে খুব কার্যকর হবে না কারণ আপনাকে অন্য মেশিনে অ্যাডমিন সুবিধা থাকতে হবে পাশাপাশি ব্যাচের পাসওয়ার্ড দিতে হবে)। তবে ফিল্টারিংয়ের জন্য আপনাকে প্রক্রিয়া নাম ব্যবহার করতে হবে।


এটি কিছু মারাত্মক কালো ব্যাচের যাদু! আমি আশা করি আমি আরও বার upvote করতে পারে!
অ্যাক্সারিড্যাক্স

নাহ, এটির হ্যাংটি পেয়ে গেলে এটি মোটামুটি প্রাথমিক জিনিস ;-)
জোয়

'Wc' কমান্ডটি আমার উইন 10 কমান্ড লাইনে উপলভ্য নয়। আমি আর কি ব্যবহার করতে পারি?
পিটারকো

1
@PeterCo: find /c /v ""
জোয়ি

1

ব্যাচ ফাইলগুলি অত্যন্ত বুনিয়াদি স্ক্রিপ্টিংয়ের জন্য এবং কোনও ধরণের মাল্টিথ্রেডিং সমর্থন করে না। আপনি যা করতে চান তা করতে আপনার নিজের ইউটিলিটি লিখতে হবে।

বিকল্পভাবে, উইন্ডোজ পাওয়ারশেল আপনাকে আপনার লক্ষ্যের নিকটবর্তী করতে আরও ক্ষমতা সরবরাহ করতে পারে।

আপনি কেবল একই সময়ে একাধিক অপারেশন চালাতে চান, তাহলে আপনি কমান্ড ব্যবহার করতে পারেন শুরু একটি নতুন উইন্ডোতে PNGOUT ইউটিলিটি আরম্ভ করার জন্য। তারপরে ফর লুপটি প্রতিটি অপারেশন শেষ না করে অপেক্ষা করেই চলতে থাকবে।

পরিবর্তিত রেখাটি দেখতে এটির মতো হবে:

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

তবে নোট করুন যে এটি একই সময়ে ডিরেক্টরিতে সমস্ত ফাইলের জন্য কার্যকরভাবে PNGOUT চালু করবে , যা সম্ভবত কাম্য নয়।


এটি একটি নির্বোধ পন্থা এবং আপনি যেমন উল্লেখ করেছেন সম্ভবত আকাঙ্ক্ষিত নয়। আপনি কেবল কোরগুলি যতগুলি প্রক্রিয়া চালু করতে চান। আপনার কাছে 4 টি কোর এবং 1000 টি ফাইল রয়েছে, সমস্ত 1000 টি প্রক্রিয়াজাত না হওয়া পর্যন্ত আপনি সত্যিই একবারে কেবল 4 টি প্রক্রিয়া করতে চান। আপনি যদি চারটি কোরে একবারে সমস্ত 1000 প্রসেস করার চেষ্টা করেন তবে আপনার কম্পিউটারটি অকেজো ক্রল থেকে ধীর হয়ে যাবে।
আদিসাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.