সমান্তরাল চারটি কাজ… আমি কীভাবে এটি করব?


23

আমার একটি ডিরেক্টরিতে একগুচ্ছ পিএনজি চিত্র রয়েছে। আমার কাছে পিএনজিআউট নামক একটি অ্যাপ্লিকেশন রয়েছে যা আমি এই চিত্রগুলি সংকুচিত করতে চালিত করি। এই অ্যাপ্লিকেশনটি আমার করা স্ক্রিপ্ট দ্বারা কল করা হয়। সমস্যাটি হ'ল এই স্ক্রিপ্টটি একবারে এটি করে:

FILES=(./*.png)
for f in  "${FILES[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 $f R${f/\.\//}
done

একবারে কেবল একটি ফাইল প্রক্রিয়া করতে অনেক সময় লাগে takes এই অ্যাপটি চালানোর পরে, আমি দেখতে পাচ্ছি যে সিপিইউ মাত্র 10%। সুতরাং আমি আবিষ্কার করেছি যে আমি এই ফাইলগুলি 4 টি ব্যাচে বিভক্ত করতে পারি, প্রতিটি ব্যাচকে একটি ডিরেক্টরিতে রেখে 4 ফায়ার করতে পারি, চারটি টার্মিনাল উইন্ডো, চারটি প্রক্রিয়া, তাই আমার স্ক্রিপ্টের চারটি উদাহরণ রয়েছে একই সাথে, সেই চিত্রগুলি এবং প্রক্রিয়াটি কাজ সময় লাগে 1/4।

দ্বিতীয় সমস্যাটি হ'ল আমি ইমেজ এবং ব্যাচগুলিকে বিভক্ত করার এবং স্ক্রিপ্টটি চারটি ডিরেক্টরিতে অনুলিপি করা, 4 টি টার্মিনাল উইন্ডো খুলতে, ব্লে ...

কোনও স্ক্রিপ্ট দিয়ে কীভাবে কিছু ভাগ না করে?

আমি দুটি জিনিস বোঝাতে চাইছি: প্রথমত আমি কীভাবে ব্যাশ স্ক্রিপ্ট থেকে কোনও প্রক্রিয়াটিকে পটভূমিতে ফায়ার করব? (কেবলমাত্র শেষের দিকে যোগ করুন?) দ্বিতীয়: চতুর্থ টাস্কগুলি প্রেরণের পরে আমি কীভাবে পটভূমিতে কাজগুলি পাঠানো বন্ধ করব এবং স্ক্রিপ্টটি টাস্কগুলি শেষ না হওয়া পর্যন্ত অপেক্ষা করার জন্য রাখব? আমি বলতে চাইছি, কেবল একটি কাজ শেষ হিসাবে পটভূমিতে একটি নতুন টাস্ক প্রেরণ করা, সর্বদা 4 টি কাজ সমান্তরাল রেখে? যদি আমি এটি না করি তবে লুপটি লক্ষ লক্ষ কাজগুলিকে ব্যাকগ্রাউন্ডে ফেলে দেবে এবং সিপিইউ আটকে যাবে।


উত্তর:


33

আপনার যদি এর একটি অনুলিপি xargsসমান্তরাল সম্পাদন সমর্থন করে তবে -Pআপনি তা করতে পারেন

printf '%s\0' *.png | xargs -0 -I {} -P 4 ./pngout -s0 {} R{}

অন্যান্য ধারণার জন্য, উওলজ বাশ উইকির প্রসেস ম্যানেজমেন্ট নিবন্ধে একটি বিভাগ রয়েছে যা আপনি ঠিক কী চান তা বর্ণনা করে।


2
এছাড়াও এই মামলার জন্য ডিজাইন করা "gnu সমান্তরাল" এবং "xjobs" রয়েছে। এটি বেশিরভাগ স্বাদের বিষয় যা আপনি পছন্দ করেন।
জানুন

আপনি দয়া করে প্রস্তাবিত আদেশটি ব্যাখ্যা করতে পারেন? ধন্যবাদ!
ইউজিন এস

1
@ ইউজিনস কোন অংশ সম্পর্কে আপনি কিছুটা সুনির্দিষ্ট হতে পারেন? প্রিন্টফ সমস্ত পিএনজি ফাইল সংগ্রহ করে এবং পাইপের মাধ্যমে এটিকে জার্গে পৌঁছে দেয়, যা স্ট্যান্ডার্ড ইনপুট থেকে আর্গুমেন্ট সংগ্রহ করে এবং pngoutওপি চালাতে চেয়েছিল সেই আদেশের জন্য তাদেরকে যুক্তিতে যুক্ত করে । মূল বিকল্পটি হ'ল -P 4, যা xargs কে 4 টি সমবর্তী কমান্ড ব্যবহার করতে বলে।
jw013

2
সুনির্দিষ্ট না হওয়ার জন্য দুঃখিত। আমি বিশেষভাবে আগ্রহী ছিলাম আপনি printfএখানে নিয়মিত না হয়ে কেন ফাংশন ব্যবহার করলেন ls .. | grep .. *.png? এছাড়াও xargsআপনি ব্যবহৃত প্যারামিটারগুলিতে ( -0এবং -I{}) আগ্রহী ছিলাম । ধন্যবাদ!
ইউজিন এস

3
@ ইউজিনিস এটি সর্বোচ্চ নির্ভুলতা এবং দৃust়তার জন্য। ফাইলের নামগুলি লাইন নয় এবং lsফাইলগুলি পোর্টেবল এবং নিরাপদে পার্স করতে ব্যবহার করা যায় না । শুধুমাত্র নিরাপদ অক্ষর সীমা নির্দেশ করা ফাইল নাম ব্যবহার করতে \0এবং /, প্রত্যেক অন্যান্য চরিত্র যেহেতু সহ \n, ফাইলের নাম নিজেই অংশ হতে পারে। printfব্যবহারসমূহ \0সীমানা ফাইলের নাম, এবং -0জানায় xargsএই। -I{}বলে xargsপ্রতিস্থাপন {}যুক্তি দিয়ে।
jw013

8

ইতিমধ্যে প্রস্তাবিত সমাধানগুলি ছাড়াও, আপনি এমন একটি মেকফিল তৈরি করতে পারেন যা বর্ণনা করবে যে কীভাবে সঙ্কুচিত থেকে সংকুচিত ফাইল তৈরি make -j 4করা যায় এবং সমান্তরালে 4 টি চাকরি চালানো যায়। সমস্যাটি হ'ল আপনার সংকুচিত এবং সংকোচিত ফাইলগুলির আলাদা আলাদা নামকরণ করতে হবে, বা সেগুলি বিভিন্ন ডিরেক্টরিতে সঞ্চয় করতে হবে, অন্যথায় যুক্তিসঙ্গত মেক রুল লেখা অসম্ভব।


7

আপনার যদি জিএনইউ সমান্তরাল http://www.gnu.org/software/parallel/ ইনস্টল থাকে তবে আপনি এটি করতে পারেন:

parallel ./pngout -s0 {} R{} ::: *.png

আপনি জিএনইউ সমান্তরাল সহজেই এটি ইনস্টল করতে পারেন:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

আরও জানতে জিএনইউ সমান্তরালের জন্য অন্তর্ভুক্ত ভিডিওগুলি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


5

আপনার দুটি প্রশ্নের উত্তর দিতে:

  • হ্যাঁ, লাইনের শেষে যুক্ত করা এবং পটভূমি প্রক্রিয়া আরম্ভ করার জন্য আপনাকে শেলকে নির্দেশ দেবে।
  • waitকমান্ডটি ব্যবহার করে , আপনি শেলটিকে আরও এগিয়ে যাওয়ার আগে পটভূমিতে সমস্ত প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করতে বলতে পারেন।

এখানে স্ক্রিপ্টটি সংশোধন করা হয়েছে যাতে এটি jপটভূমি প্রক্রিয়াগুলির সংখ্যা ট্র্যাক রাখতে ব্যবহৃত হয়। যখন NB_CONCURRENT_PROCESSESপৌঁছে যায়, স্ক্রিপ্টটি j0 এ পুনরায় সেট হবে এবং এর পুনরায় প্রয়োগের আগে সমস্ত পটভূমি প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করবে ।

files=(./*.png)
nb_concurrent_processes=4
j=0
for f in "${files[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 "$f" R"${f/\.\//}" &
        ((++j == nb_concurrent_processes)) && { j=0; wait; }
done

1
এটি চারটি সমবর্তী প্রক্রিয়ার শেষের জন্য অপেক্ষা করবে এবং তারপরে আরও চারটি সেট শুরু করবে। সম্ভবত একটিতে চারটি পিআইডি একটি অ্যারে তৈরি করা উচিত এবং তারপরে এই নির্দিষ্ট পিআইডিগুলির জন্য অপেক্ষা করা উচিত?
নিলস

কোডটিতে আমার সংশোধনগুলি কেবল ব্যাখ্যা করার জন্য: (1) স্টাইলের বিষয় হিসাবে, সমস্ত বড় হাতের অক্ষরগুলি এড়িয়ে চলুন কারণ তারা অভ্যন্তরীণ শেল ভেরিয়েবলের সাথে সম্ভাব্য দ্বন্দ্ব রয়েছে। (২) $fইত্যাদির জন্য উদ্ধৃতি যুক্ত করা হয়েছে (৩) [পসিক্স সুসংগত স্ক্রিপ্টগুলির জন্য ব্যবহার করুন তবে খাঁটি বাশের [[জন্য সর্বদা পছন্দ করা হয়। এই ক্ষেত্রে, ((গাণিতিক জন্য আরো উপযুক্ত।
jw013
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.