# كيفية وضع قائمة انتظار لوظيفة طويلة الأمد بأفضل طريقة

**URL:** https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533
**Category:** Development
**Created:** [16 ديسمبر 2020، 9:04م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533 "2020-12-16T21:04:29Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 ديسمبر 2020، 9:04م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/1 "2020-12-16T21:04:29Z")

</div>

لذا لدي إضافة تقوم بتشغيل Ansible لتنفيذ تثبيت Discourse (أريد حقًا حقًا التوقف عن استخدام WordPress لأخذ [طلبات التثبيت](https://www.literatecomputing.com/discourse-installation-packages/)!).

في البداية، كنت أستخدم `fork` لتشغيل العملية، وهو ما عمل بشكل جيد في الاختبارات، لكنني اعتقدت أنه يجب عليّ فعل ذلك بطريقة “Discourse” أكثر.

لذلك قمت بإنشاء مهمة لمرة واحدة لتشغيل العملية، لكنها تُقتل بهذه الطريقة:

```
E, [2020-12-16T12:53:39.662683 #3158277] ERROR -- : worker=0 PID:3158425 timeout (61s > 60s), killing

```

حاولت إضافة `sidekiq_options queue: 'low'` إلى الفئة، ثم إلى الدالة التي تشغل المهمة.

ثم تخطيت جعل المهمة تشغل العملية، وقمت بتشغيلها مباشرة في النموذج باستخدام:

```
         Discourse::Utils.execute_command(*instructions)

```

تعمل بشكل ممتاز إذا قمت بتشغيلها من `rails c`، ولكن مهما حاولت تشغيلها (هذا بيئة تطوير على Ubuntu، تم تشغيلها باستخدام `./bin/unicorn`)، فإنها تُقتل.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [16 ديسمبر 2020، 10:08م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/2 "2020-12-16T22:08:55Z")

</div>

> [@pfaffman](#):
>
> لذلك قمت بإنشاء وظيفة لمرة واحدة لتشغيل العملية، لكنها تُقتل بهذه الطريقة:

الوظائف لمرة واحدة هي وظائف تُنفذ مرة واحدة فقط. يبدو أن ما تحتاجه هو وظيفة [عادية](https://github.com/discourse/discourse/tree/master/app/jobs/regular) يتم جدولتها بواسطة مُفعِّل، مثل طلب يصل إلى وحدة تحكم.

يمكن أن تكون الوظائف العادية أطول من 60 ثانية، كما يحدث في بعض الحالات أثناء الاستخدام العادي.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 ديسمبر 2020، 10:28م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/3 "2020-12-16T22:28:16Z")

</div>

حسنًا، قمت بنقله إلى وظيفة عادية وحاولت تشغيله باستخدام `./bin/rails s` بدلاً من `./bin/unicorn`، ولا يزال الأمر دون جدوى.

هذا لا معنى له لأنني أعرف أن العديد من تلك الوظائف تستغرق أكثر من دقيقة.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [16 ديسمبر 2020، 10:32م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/4 "2020-12-16T22:32:45Z")

</div>

كيف تقوم بتشغيل المهمة بالضبط؟ هل يمكنك لصق الجزء ذي الصلة من كود Ruby؟

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 ديسمبر 2020، 10:36م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/5 "2020-12-16T22:36:55Z")

</div>

بالتأكيد!

[https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create\_droplet.rb](https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create_droplet.rb)

[https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172](https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172)

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [16 ديسمبر 2020، 10:46م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/6 "2020-12-16T22:46:19Z")

</div>

لماذا تستخدم

```ruby
Jobs::CreateDroplet.new.execute(server_id: id)

```

بدلاً من

```ruby
Jobs.enqueue(:create_droplet, server_id: id)

```

في [https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146؟](https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146%D8%9F)

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 ديسمبر 2020، 11:06م UTC](https://meta.discourse.org/t/how-best-to-queue-a-long-running-job/173533/7 "2020-12-16T23:06:48Z")

</div>

> [@فالكو، منشور: 6، موضوع: 173533](#):
>
> لماذا تستخدم…

ولهذا السبب أحتاج إلى طرح الأسئلة! لأنني مجرد إنسان بدائي. (لا قصد بالإساءة إلى أي شخص يعيش في كهف.)

بالطبع، لا يوجد سبب محدد. لم أستطع ببساطة معرفة كيف يُفترض بي أن أستخدمه!

شكرًا جزيلاً!

 ![image](https://global.discourse-cdn.com/meta/original/3X/7/f/7f1e1feece7caa41ab1c56e790be91ec1fac3a10.png)

… وما زال يعمل! …

 ![image](https://global.discourse-cdn.com/meta/original/3X/2/f/2f4c569e18ba2fbc951c31d4be7ac03d7af7c93a.png)

شكرًا جزيلاً. استغرق هذا الأمر بضع ساعات على الأقل…

الخطوة التالية: تشغيله على خادم إنتاج حقيقي…
