সেলারিতে টাস্কের স্থিতি কীভাবে পরীক্ষা করবেন?


95

কোনও কাজ সেলারিতে চলছে কিনা তা কীভাবে পরীক্ষা করা যায় (বিশেষত, আমি সেলারি-জাঙ্গো ব্যবহার করছি)?

আমি ডকুমেন্টেশন পড়েছি, এবং আমি গুগল করেছি, কিন্তু আমি এর মতো কল দেখতে পাচ্ছি না:

my_example_task.state() == RUNNING

আমার ব্যবহারের ক্ষেত্রে হ'ল ট্রান্সকোডিংয়ের জন্য আমার কাছে একটি বাহ্যিক (জাভা) পরিষেবা রয়েছে। আমি যখন কোনও দস্তাবেজ ট্রান্সকোড করার জন্য প্রেরণ করি, তখন আমি এটি যাচাই করতে চাই যে সেই পরিষেবাটি চালিত টাস্কটি চলছে কিনা, এবং যদি না হয়, (পুনরায়) শুরু করতে।

আমি বর্তমান স্থিতিশীল সংস্করণগুলি ব্যবহার করছি - ২.৪, আমি বিশ্বাস করি।

উত্তর:


98

টাস্ক_আইডিটি (যা .ডিলে () থেকে দেওয়া হয়) ফেরান এবং সেলারি উদাহরণটি পরে রাষ্ট্র সম্পর্কে জিজ্ঞাসা করুন:

x = method.delay(1,2)
print x.task_id

জিজ্ঞাসা করার সময়, এই টাস্ক_আইডিটি ব্যবহার করে একটি নতুন অ্যাসিঙ্কআরসাল্ট পান:

from celery.result import AsyncResult
res = AsyncResult("your-task-id")
res.ready()

11
ধন্যবাদ, তবে যদি আমার অ্যাক্সেস না থাকে x?
মার্সিন

4
আপনি কোথায় সেলারি হিসাবে আপনার কাজ সজ্জিত করবেন? ভবিষ্যতে কাজের ট্র্যাক করতে আপনাকে এখানে টাস্ক_আইডি ফিরে আসতে হবে।
গ্রেগার ২

@ মার্সিনের বিপরীতে, এই উত্তরটি অ্যাসিঙ্কআরসাল্টের কারখানা হিসাবে স্থির পদ্ধতি টাস্ক.এ্যাসেন্সারসেল্ট () ব্যবহার করে না, যা সহায়কভাবে ব্যাকএন্ড কনফিগারেশনটিকে পুনরায় ব্যবহার করে, অন্যথায় ফলাফল পাওয়ার চেষ্টা করার সময় একটি ত্রুটি উত্থাপিত হয়।
আর্নাউরিওলস

4
@ ক্রিস @ গ্রেগ্রার কোডটি নিয়ে তর্ক শুরু হয়েছে async_result। আপনার ব্যবহারের ক্ষেত্রে ইতিমধ্যে উদাহরণ রয়েছে, আপনি যেতে ভাল। তবে আপনার যদি কেবলমাত্র টাস্ক আইডি থাকে এবং async_resultকল করতে সক্ষম হওয়ার জন্য কোনও দৃষ্টান্ত ইনস্ট্যান্ট করতে হবে তবে async_result.get()কী হবে ? এটি AsyncResultক্লাসের উদাহরণ , তবে আপনি কাঁচা বর্গ ব্যবহার করতে পারবেন না celery.result.AsyncResult, আপনার দ্বারা মোড়ানো ফাংশন থেকে ক্লাসটি নেওয়া দরকার app.task()। আপনার ক্ষেত্রে আপনি করবেনasync_result = run_instance.AsyncResult('task-id')
ArnauOrriols

4
but you cannot use the raw class celery.result.AsyncResult, you need to get the class from the function wrapped by app.task(). - আমি মনে করি এটি আসলে এটি ব্যবহার করার কথা ছিল। কোডটি পড়ুন: github.com/celery/celery/blob/…
নেভেলিস

74

একটি তৈরি করা হচ্ছে AsyncResultটাস্ক আইডি থেকে অবজেক্ট হয় ভাবে সুপারিশ করা প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী টাস্ক অবস্থা প্রাপ্ত যখন একমাত্র জিনিস আপনি টাস্ক আইডি হল।

তবে, সেলারি ৩.x হিসাবে, উল্লেখযোগ্য সতর্কতা রয়েছে যা যদি মানুষ তাদের দিকে মনোযোগ না দেয় তবে তারা তাদের কামড় দিতে পারে। এটি সত্যই নির্দিষ্ট ব্যবহারের ক্ষেত্রে দৃশ্যের উপর নির্ভর করে।

ডিফল্টরূপে, সেলারি কোনও "চলমান" রাষ্ট্র রেকর্ড করে না।

সেলারিটি কোনও কাজ চলছে কিনা তা রেকর্ড করার জন্য আপনাকে অবশ্যই সেট আপ task_track_startedকরতে হবে True। এখানে এটি একটি সাধারণ কাজ যা এটি পরীক্ষা করে:

@app.task(bind=True)
def test(self):
    print self.AsyncResult(self.request.id).state

যখন task_track_startedহয় Falseযা ডিফল্টভাবে হয়, রাষ্ট্র শো PENDINGযদিও কাজের শুরু হয়েছে। আপনি যদি সেট আপ task_track_startedকরেন True, তবে রাষ্ট্রটি হবে STARTED

রাষ্ট্রটির PENDINGঅর্থ "আমি জানি না"।

AsyncResultরাষ্ট্রের সাথে একটি এর PENDINGঅর্থ সেলারি যে কাজের স্থিতি জানে না তার চেয়ে বেশি কিছু বোঝায় না। এটি কোনও কারণেই হতে পারে।

একটি জিনিসের জন্য, AsyncResultঅবৈধ টাস্ক আইডির সাহায্যে তৈরি করা যেতে পারে। এই জাতীয় "কাজগুলি" সিলারি দ্বারা মুলতুবি হিসাবে বিবেচিত হবে:

>>> task.AsyncResult("invalid").status
'PENDING'

ঠিক আছে, সুতরাং কেউ স্পষ্টতই অবৈধ আইডিগুলিকে খাওয়াবে না AsyncResult। যথেষ্ট উপযুক্ত, তবে এটি কার্যকরভাবে কার্যকর হয়েছে যা AsyncResultসফলভাবে চালিত কোনও কাজকেও বিবেচনা করবে তবে সেলেরি তা ভুলে গেছে PENDINGআবার কিছু ব্যবহারের ক্ষেত্রেও এটি সমস্যা হতে পারে। ইস্যুর অংশটি কাজের ফলাফলগুলি রাখার জন্য সিলারি কীভাবে কনফিগার করা হয়েছে তার উপর নির্ভর করে, কারণ এটি ফলাফলের পিছনে "সমাধিপাথরের" প্রাপ্যতার উপর নির্ভর করে। ব্যবহার ( "Tombstones" তথ্য খন্ডে রেকর্ড কিভাবে কাজটি সমাপ্ত সেলারি ডকুমেন্টেশন শব্দটি ব্যবহার।) AsyncResultএ সব কাজ না যদি task_ignore_resultহয় True। আরও উদ্বেগজনক সমস্যা হ'ল সিলারি সমাধিস্থলগুলি ডিফল্টরূপে সমাপ্ত করে। দ্যresult_expiresডিফল্টরূপে সেটিংস 24 ঘন্টা সেট করা থাকে। সুতরাং আপনি যদি কোনও কাজ চালু করেন এবং দীর্ঘমেয়াদী স্টোরেজে আইডিটি রেকর্ড করেন এবং আরও 24 ঘন্টা পরে, আপনি AsyncResultএটির সাথে একটি তৈরি করেন, স্থিতিটি হবে PENDING

সমস্ত "আসল কাজ" শুরু PENDINGরাজ্যে। সুতরাং PENDINGকোনও টাস্কে উঠার অর্থ এই হতে পারে যে এই টাস্কটির জন্য অনুরোধ করা হয়েছিল তবে এটি (যে কারণেই হোক) এর চেয়ে বেশি কখনও অগ্রসর হয়নি। বা এটির অর্থ টাস্কটি দৌড়াতে পারে তবে সেলারি এর অবস্থা ভুলে গিয়েছিল।

আউচ! AsyncResultআমার জন্য কাজ করবে না। আমি আর কী করতে পা্রি?

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


উপরের পরিবর্তনশীল নাম এবং হাইপারলিঙ্কগুলি সেলারি 4.x এর জন্য are 3.x সংশ্লিষ্ট ভেরিয়েবল এবং হাইপারলিংক আছেন: CELERY_TRACK_STARTED, CELERY_IGNORE_RESULT, CELERY_TASK_RESULT_EXPIRES


সুতরাং যদি আমি পরে ফলাফলটি দেখতে চাই (সম্ভবত অন্য কোনও প্রক্রিয়ার মধ্যেও), তবে আমি নিজের বাস্তবায়ন দিয়ে আরও ভাল আছি? ফলস্বরূপ ডাটাবেসে ফলাফল সংরক্ষণ করা হচ্ছে?
ফ্রাঙ্কলিন ইউ

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

এবং "সমস্ত বাইবেলোগ্রাফিক রেফারেন্স সহ সমাধান করা তথ্য" নিবন্ধটি একটি মেমরি ক্যাশে এবং একটি এক্সিস্ট-ডিবি ডাটাবেসে সংরক্ষণ করা হয়।
লুই 16

63

প্রতিটি Taskবস্তুর একটি .requestসম্পত্তি থাকে, এতে এটি AsyncRequestআপত্তি করে। তদনুসারে, নিম্নলিখিত লাইনটি একটি কার্যের অবস্থা দেয় task:

task.AsyncResult(task.request.id).state

4
কোনও কাজের অগ্রগতির শতাংশ সংরক্ষণ করার কোনও উপায় আছে কি?
প্যাট্রিক

4
আমি যখন এটি করি, আমি টাস্কটি শেষ হওয়ার জন্য দীর্ঘ সময় অপেক্ষা করলেও স্থায়ীভাবে পেনডিং অ্যাসিঙ্করসাল্ট পাই। এটি রাষ্ট্রের পরিবর্তনগুলি দেখার কোনও উপায় আছে? আমি বিশ্বাস করি যে আমার ব্যাকএন্ডটি কনফিগার করা আছে এবং আমি CELERY_TRACK_STARTED = সত্য ব্যবহারের চেষ্টা করেছি।
ডিস্ট্রোমবার্গ

4
@dstromberg দুর্ভাগ্যক্রমে 4 বছর হয়েছে যেহেতু এটি আমার জন্য একটি সমস্যা ছিল, তাই আমি সাহায্য করতে পারি না। স্থিতি ট্র্যাক করতে আপনার অবশ্যই অবশ্যই সেলারি কনফিগার করতে হবে।
মার্সিন

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

16

আপনি কাস্টম রাজ্যগুলি তৈরি করতে এবং এটির মূল্য ডিউটিং টাস্কের কার্যকরকরণ আপডেট করতে পারেন। এই উদাহরণটি ডক্স থেকে:

@app.task(bind=True)
def upload_files(self, filenames):
    for i, file in enumerate(filenames):
        if not self.request.called_directly:
            self.update_state(state='PROGRESS',
                meta={'current': i, 'total': len(filenames)})

http://celery.readthedocs.org/en/latest/userguide/tasks.html#custom-states


11

পুরানো প্রশ্ন তবে আমি সম্প্রতি এই সমস্যার মধ্যে পড়েছিলাম।

যদি আপনি টাস্ক_আইডি পাওয়ার চেষ্টা করছেন আপনি এটি এটি করতে পারেন:

import celery
from celery_app import add
from celery import uuid

task_id = uuid()
result = add.apply_async((2, 2), task_id=task_id)

এখন আপনি জানেন যে টাস্ক_আইডিটি ঠিক কী এবং এখন এটি অ্যাসিঙ্কআরসাল্ট পেতে এটি ব্যবহার করতে পারেন:

# grab the AsyncResult 
result = celery.result.AsyncResult(task_id)

# print the task id
print result.task_id
09dad9cf-c9fa-4aee-933f-ff54dae39bdf

# print the AsyncResult's status
print result.status
SUCCESS

# print the result returned 
print result.result
4

4
আপনার নিজের টাস্ক আইডি তৈরি এবং এটি পাস করার কোনও দরকার নেই apply_async। ফেরত দেওয়া অবজেক্টটি apply_async হ'ল একটি AsyncResultঅবজেক্ট, এতে সেলারি তৈরি করা টাস্কটির আইডি থাকে।
লুই

4
আমি যদি ভুল হয়ে থাকি তবে আমাকে সংশোধন করুন, তবে কিছু ইনপুটগুলির উপর ভিত্তি করে কোনও ইউইউডি উত্পন্ন করা কখনও কখনও কার্যকর হয় না, যাতে একই ইনপুট প্রাপ্ত সমস্ত কল একই ইউআইডি পায়? আইওডাব্লু, সম্ভবত কখনও কখনও এটি আপনার টাস্ক_আইডি নির্দিষ্ট করতে কার্যকর।
dstromberg

4
@ ডিস্ট্রোমবার্গ ওপি কর্তৃক জিজ্ঞাসিত প্রশ্নটি হ'ল "আমি কীভাবে টাস্কের স্থিতি চেক করব" এবং উত্তরটি এখানে "আপনি যদি টাস্ক_আইডি পাওয়ার চেষ্টা করছেন ..." বলে থাকে। টাস্কের স্থিতি যাচাই করাও নয় task_id, আপনি নিজেই কোনও টাস্ক আইডি তৈরি করার প্রয়োজন নেই । আপনার মন্তব্যে, আপনি এমন কোনও কারণ কল্পনা করেছিলেন যা "আমি কীভাবে টাস্কের স্থিতি চেক করব" এবং "যদি আপনি টাস্ক_আইডি পাওয়ার চেষ্টা করছেন ...` আপনার যদি প্রয়োজন হয় তবে দুর্দান্ত এটি যদি না হয় তবে এখানে। (তাছাড়া, uuid()কোনও টাস্ক আইডি জেনারেট করে সিলারি ডিফল্টরূপে যা কিছু করে তার বাইরে কিছুই করে না ))
লুই

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



0

চেষ্টা করুন:

task.AsyncResult(task.request.id).state

এটি সেলারি টাস্কের স্থিতি সরবরাহ করবে। যদি সেলারি টাস্কটি ইতিমধ্যে ব্যর্থতার অধীনে থাকে তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে:

raised unexpected: KeyError('exc_type',)


0

সাধারণ কাজের জন্য, আমরা মনিটরিংয়ের জন্য http://flower.readthedocs.io/en/latest/screenshots.html এবং http://policystat.github.io/jobtastic/ ব্যবহার করতে পারি।

এবং জটিল কাজের জন্য, এমন একটি কাজ বলুন যা অন্যান্য অনেকগুলি মডিউল নিয়ে কাজ করে। আমরা নির্দিষ্ট টাস্ক ইউনিটে ম্যানুয়ালি অগ্রগতি এবং বার্তাটি রেকর্ড করার প্রস্তাব দিই।


0

আমি সহায়ক তথ্য পেয়েছি

সিলারি প্রকল্পের শ্রমিক-পরিদর্শক-কর্মীদের নির্দেশিকা

আমার ক্ষেত্রে, আমি সিলারি চলমান কিনা তা পরীক্ষা করে দেখছি।

inspect_workers = task.app.control.inspect()
if inspect_workers.registered() is None:
    state = 'FAILURE'
else:
    state = str(task.state) 

আপনার প্রয়োজনীয়তা পেতে আপনি পরিদর্শন করে খেলতে পারেন।


0
  • প্রথম your আপনার সেলারি অ্যাপে ,

vi আমার_সওয়ারি_এপস / অ্যাপ 1.py

app = Celery(worker_name)
  • এবং তারপরে, টাস্ক ফাইলে পরিবর্তন করুন your আপনার সেলারি অ্যাপ্লিকেশন মডিউল থেকে অ্যাপ্লিকেশন আমদানি করুন।

vi টাস্ক / টাস্ক 1.py

from my_celery_apps.app1 import app

app.AsyncResult(taskid)

try:
   if task.state.lower() != "success":
        return
except:
    """ do something """


-1

উপরে কর্মসূচী পদ্ধতি ছাড়াও ফুলের কার্যকারিতা ব্যবহার করে সহজেই দেখা যায়।

সিলারি ইভেন্টগুলি ব্যবহার করে রিয়েল-টাইম মনিটরিং। ফ্লাওয়ার সেলারি ক্লাস্টারগুলি পর্যবেক্ষণ ও পরিচালনা করার জন্য একটি ওয়েব ভিত্তিক সরঞ্জাম।

  1. কার্য অগ্রগতি এবং ইতিহাস
  2. কাজের বিবরণ (আর্গুমেন্ট, শুরুর সময়, রানটাইম এবং আরও অনেক কিছু) দেখানোর ক্ষমতা
  3. গ্রাফ এবং পরিসংখ্যান

অফিসিয়াল ডকুমেন্ট: ফুল - সেলারি পর্যবেক্ষণের সরঞ্জাম

স্থাপন:

$ pip install flower

ব্যবহার:

http://localhost:5555

-1
res = method.delay()
    
print(f"id={res.id}, state={res.state}, status={res.status} ")

print(res.get())

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