首页 > 解决方案 > Python & Docker 不清理线程

问题描述

我的服务器上有 docker,premium_daemon.py 作为守护进程清除数据库并取消订单。

premium_daemon.py

import time

from django.core.management import BaseCommand
from django.utils import timezone

from adminPanel.models import MyUser, Message, User_purchase, Bot_user, Item
from apiV1.bot_services import send_order_canceled


class Command(BaseCommand):

    def handle(self, *args, **options):
        while True:
            users = MyUser.objects.filter(is_premium=True)
            for user in users:
                if user.premium_expiration_date < timezone.now():
                    user.is_premium = False
                    user.save()
            messages = Message.objects.all()
            for message in messages:
                if timezone.now() > message.created_at + timezone.timedelta(days=7):
                    message.delete()
            orders = User_purchase.objects.filter(is_paid=False)
            for order in orders:
                admin_user_obj = MyUser.objects.get(id=order.belongs)
                if order.time_created + timezone.timedelta(minutes=admin_user_obj.booking_time) < timezone.now():
                    send_order_canceled(order)
                    bot_user = Bot_user.objects.get(belongs=order.belongs, chat_id=order.chat_id)
                    if order.balance_to_return:
                        bot_user.balance += order.balance_to_return
                    bot_user.active_orders -= 1
                    bot_user.save()
                    try:
                        item = Item.objects.get(id=order.item)
                        if item.strings == '':
                            item.strings = '\r\n'.join(order.strings.split('\n'))
                        else:
                            item.strings = '\r\n'.join((order.strings.replace('\n', '\r\n') + '\r\n' + item.strings).split('\r\n'))
                        item.quantity = len(item.strings.split('\r\n'))
                        item.save()
                        order.delete()
                    except:
                        pass
            time.sleep(10)

码头工人-compose.prod

  premium_daemon:
    build: ./app
    command: python manage.py premium_daemon
    volumes:
      - ./app/:/usr/src/app/
    env_file:
      - ./.env.prod
    depends_on:
      - db

运行 docker 20 分钟后我的 htop: htop

如您所见,我有 2400 个线程 premium_daemon.py

它是如何运作的?为什么python不清理线程?他们如何创建,我不使用线程。

如何清理线程?

标签: pythondjangodockerdjango-modelsdocker-compose

解决方案


推荐阅读