সিলারির সাথে ইতিমধ্যে একটি নির্বাহক টাস্ক বাতিল করবেন?


96

আমি ডকটি পড়েছি এবং অনুসন্ধান করছি কিন্তু এর কোনও সরল উত্তর খুঁজে পাচ্ছে না:

আপনি কি ইতিমধ্যে সম্পাদনকারী কোনও কাজ বাতিল করতে পারেন? (যেমন কাজটি শুরু হয়েছে, কিছুটা সময় নেয় এবং এর অর্ধেক পথ বাতিল করা দরকার)

আমি ডিল থেকে এটি সেলারি এফএকিউতে পেয়েছি

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

তবে এটি স্পষ্ট নয় যে এটি সারি কাজগুলি বাতিল করে দিবে বা এটি কোনও শ্রমিকের চলমান প্রক্রিয়াটিকে মেরে ফেলবে কিনা। আপনি চালাতে পারেন যে কোনও আলো জন্য ধন্যবাদ!

উত্তর:


185

প্রত্যাহার কার্য সম্পাদন বাতিল করে। যদি কোনও কাজ প্রত্যাহার করা হয়, তবে শ্রমিকরা কাজটিকে অগ্রাহ্য করে এবং এটি সম্পাদন করে না। আপনি যদি অবিচলিত প্রত্যাহারগুলি ব্যবহার না করেন তবে আপনার কাজটি কর্মীর পুনরায় চালু হওয়ার পরে কার্যকর করা যেতে পারে।

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistance-revokes

প্রত্যাহারের একটি টার্মিনেট বিকল্প রয়েছে যা ডিফল্টরূপে মিথ্যা । যদি আপনাকে এক্সিকিউটিভ টাস্কটি হত্যার প্রয়োজন হয় তবে আপনার এটিকে সত্য হিসাবে শেষ করতে হবে ।

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks


4
ঠিক এই ব্যাখ্যাটি আমি খুঁজছিলাম, আপনাকে ধন্যবাদ!
dcoffey3296

4
এই বিতরণ env মধ্যে কাজ করে? আমি বলতে চাইছি যদি আমার একাধিক মেশিনে কর্মী থাকে যা কার্য সম্পাদন করে। সেলারিটি কোন মেশিনটি টাস্কটি চালায় তা ট্র্যাক করে রাখে?
ksrini

4
এটা করে. কর্মীদের সাথে যোগাযোগ দালালের মাধ্যমে হয়।
মার্শ

4
রেজাল্ট.রভোক (টার্মিনেট = সত্য) একই কাজ করা উচিত প্রত্যাহার (টাস্ক_আইডি, টার্মিনেট = সত্য)
ক্যামহার্ট

10
এছাড়াও, সাম্প্রতিক বিকল্পটি ব্যবহার করা সাম্প্রতিক সেলারি ডক্স অনুসারে "প্রশাসকদের জন্য একটি শেষ অবলম্বন"। আপনি সম্প্রতি অন্য একটি কাজ শেষ করার ঝুঁকি চালান যা সেই কর্মীর উপর সম্প্রতি শুরু হয়েছিল।
কাউক

38

সেলারি ৩.১-তে, প্রত্যাহার করা কার্যগুলির এপিআই পরিবর্তন করা হয়েছে।

সেলারি এফএকিউ অনুসারে , আপনার ফলাফল ব্যবহার করা উচিত: প্রত্যাহার:

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

বা যদি আপনার কেবলমাত্র টাস্ক আইডি থাকে:

>>> from proj.celery import app
>>> app.control.revoke(task_id)

25

@ 0x00mh এর উত্তর সঠিক, তবে সাম্প্রতিক সেলারি ডক্স বলছে যে terminateবিকল্পটি ব্যবহার করা " প্রশাসকদের জন্য একটি শেষ অবলম্বন " কারণ আপনি ভুলবশত অন্য কোনও কাজটি শেষ করতে পারেন যা ইতিমধ্যে সম্পাদন শুরু করেছিল। সম্ভবত আরও ভাল সমাধানের সাথে সংমিশ্রণ terminate=Trueকরা হচ্ছে signal='SIGUSR1'(যার ফলে কার্যক্রমে সফটটাইমলিমিটএক্সসিডেড ব্যতিক্রম উত্থাপিত হয়)।


4
এই সমাধানটি আমার পক্ষে খুব ভাল কাজ করেছে। যখন SoftTimeLimitExceededআমার কাজে উত্থাপিত হয়, আমার কাস্টম ক্লিনআপ লজিক ( try/ except/ মাধ্যমে প্রয়োগ finallyকরা হয়) শুরু হয়। এটি আমার দৃষ্টিতে, AbortableTaskঅফারগুলির চেয়ে আরও ভাল ( ডকস.সেলারিপ্রজেক্ট.আর / এন / স্লেস্ট / রেফারেন্স /। )। পরবর্তীটির সাথে আপনার একটি ডাটাবেস ফলাফলের ব্যাকএন্ডের প্রয়োজন এবং এটি বাতিল হয়ে গেছে কিনা তা দেখার জন্য আপনাকে ম্যানুয়ালি এবং বারবার চলমান কোনও কাজের স্থিতি পরীক্ষা করতে হবে।
ডেভিড স্নাইডার

4
এটি কীভাবে ভাল, যতদূর আমি বুঝতে পারি যে প্রক্রিয়াটি গ্রহণ করে অন্য কোনও কাজ করা হয়েছে কিনা, এর যাহাই হউক না কেন থামানো হবে, ঠিক আলাদা ব্যতিক্রম ছুঁড়ে দেওয়া হবে।
মার্কসিন

আমি যদি ব্যবহার করি worker_prefetch_multiplier = 1যেহেতু আমার কাছে দীর্ঘ কয়েকটা চলমান কাজ আছে তবে টার্মিনেটটি ভাল হওয়া উচিত - যেহেতু অন্য কোনও কাজ সমাপ্তি দ্বারা প্রভাবিত হবে না - আমি কি এটি সঠিক পেয়েছি? @ স্পিসিরামেন
মাফ

1

কার্যগুলির জন্য নিম্নলিখিত বিকল্পগুলি দেখুন: সময়_হ্রাসন , সফট_টাইম_লিমিট (বা আপনি এটি কর্মীদের জন্য সেট করতে পারেন)। আপনি যদি কেবল মৃত্যুদন্ড কার্যকর করার সময়টি নিয়ন্ত্রণ করতে চান তবে অ্যাপ্লিকেশন_সায়েন্স পদ্ধতির মেয়াদ শেষ হবে see


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.