داکر قرار بود مشکل معروفِ «روی سیستم من کار میکنه!» رو حل کنه؛
اما این بار داستان برعکس شد!
چند روز پیش میخواستم نسخه جدید برنامهای که نوشته بودیم رو روی Docker راهاندازی کنم که با یک مشکل عجیب مواجه شدیم!
برنامه روی دو سیستم مختلف بدون هیچ مشکلی اجرا میشد؛
ولی وقتی همون برنامه رو داخل Docker اجرا کردیم، همهچیز به هم ریخت.
اول log شروع برنامه مدام تکرار میشد.
بعد RAM کمکم پر شد.
سرور Restart شد.
کانتینر دوباره بالا اومد…
و دوباره همون اتفاق تکرار شد!
کد تغییر نکرده بود.
سرور هم همون سرور بود.
تنها چیزی که تغییر کرده بود، نحوهی بستهبندی و اجرای برنامه بود.
بعد از بررسی مشخص شد مشکل از ترکیب: Python multiprocessing + spawn + اجرای برنامه بهصورت executable بود.
وقتی از spawn استفاده میکنید، هر Process جدید، برنامه رو از ابتدا اجرا میکنه.
در یک Python Script معمولی، این رفتار قابل مدیریته؛ اما وقتی برنامه بهصورت frozen/executable اجرا میشه، اگه نقطهی ورود Processها درست مدیریت نشده باشه، هر Worker ممکنه دوباره کل برنامه رو اجرا کنه.
یعنی چیزی شبیه این:
Process → Process → Process → RAM → Restart
و بعد دوباره از اول!
راهحل؟
جواب فقط یک خط کد است:
multiprocessing.freeze_support()
این تجربه یک نکتهی مهم برای من داشت
داکر تفاوتهای محیط اجرا رو کمتر میکنه، اما تفاوتهای مربوط به نحوهی بستهبندی و اجرای کد رو از بین نمیبره.
پس اگه برنامهای بهصورت Python Script درست کار میکنه ولی بعد از تبدیل شدن به Binary یا اجرای داخل Docker رفتار عجیبی داره، فقط سراغ Docker و تنظیمات سرور نرید؛
نحوهی ایجاد Processها و نقطهی شروع برنامه رو هم بررسی کنید.
گاهی مشکل یک معماری پیچیده نیست…
بلکه فقط یک خط کده که داره RAM سرور رو به آتش میکشه.
@DevTwitter | <Sara Sabaghan/>
Post #13503
3.49K

- 👍 26
- ❤ 11
- 👎 4