Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个永远运行的后台任务-Python FlaskSQLAlchemy_Python_Multithreading_Flask_Sqlalchemy - Fatal编程技术网

如何创建一个永远运行的后台任务-Python FlaskSQLAlchemy

如何创建一个永远运行的后台任务-Python FlaskSQLAlchemy,python,multithreading,flask,sqlalchemy,Python,Multithreading,Flask,Sqlalchemy,我想创建一个永远运行的简单后台任务。我将找到一种方法,在Flask中编写web应用程序的同时启动它 到目前为止,我得到的是: import threading from app.models import SkillTracker, UserAttributes from flask_sqlalchemy import SQLAlchemy from app import db import time, math class SkillTimer(threading.Thread, Skill

我想创建一个永远运行的简单后台任务。我将找到一种方法,在Flask中编写web应用程序的同时启动它

到目前为止,我得到的是:

import threading
from app.models import SkillTracker, UserAttributes
from flask_sqlalchemy import SQLAlchemy
from app import db
import time, math

class SkillTimer(threading.Thread, SkillTracker):
    def __init__(self, SkillTracker=SkillTracker):
        threading.Thread.__init__(self)
        self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()
    def run(self):
            # for x in range(1, 1+1):
            #     if x%1 == 0:
            #         print(x)
            # #print(x)
            time.sleep(1)
            self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()

            if self.skillcheck != []:
                print(self.skillcheck)
                for record in self.skillcheck:
                    if record.isactive == 1:
                        if record.timesubmit + record.timetowait <= time.time():
                            user = UserAttributes.query.filter_by(user_id=record.userid).first()
                            if record.targetskill == 'int':
                                record.isactive = 0
                                user.intelligence += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.intelligence, time.time()))
                            if record.targetskill == 'end':
                                record.isactive = 0
                                user.endurance += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.endurance, time.time()))
                            if record.targetskill == 'str':
                                record.isactive = 0
                                user.strength += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.strength, time.time()))
            else:
                pass
            self.skillcheck = None
            skilltime = SkillTimer()
            skilltime.run()


#while True:
skilltime = SkillTimer()
skilltime.run()
#skilltimer.run()
导入线程
从app.models导入SkillTracker、UserAttributes
从flask_sqlalchemy导入sqlalchemy
从应用程序导入数据库
输入时间、数学
类SkillTimer(threading.Thread,SkillTracker):
定义初始化(self,SkillTracker=SkillTracker):
threading.Thread.\uuuuu init\uuuuuu(自)
self.skillcheck=SkillTracker.query.filter_by(isactive=1).all()
def运行(自):
#对于范围(1,1+1)内的x:
#如果x%1==0:
#打印(x)
##打印(x)
时间。睡眠(1)
self.skillcheck=SkillTracker.query.filter_by(isactive=1).all()
如果自我技能检查!=[]:
打印(自我技能检查)
有关self.skillcheck中的记录:
如果record.isactive==1:

如果record.timesubmit+record.timetowait我会这样更改它:

import threading
from app.models import SkillTracker, UserAttributes
from flask_sqlalchemy import SQLAlchemy
from app import db
import time, math

class SkillTimer(threading.Thread, SkillTracker):
    def __init__(self, SkillTracker=SkillTracker):
        threading.Thread.__init__(self)
        self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()
    def run(self):
        while True:
            time.sleep(1)
            self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()

            if self.skillcheck != []:
                print(self.skillcheck)
                for record in self.skillcheck:
                    if record.isactive == 1:
                        if record.timesubmit + record.timetowait <= time.time():
                            user = UserAttributes.query.filter_by(user_id=record.userid).first()
                            if record.targetskill == 'int':
                                record.isactive = 0
                                user.intelligence += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.intelligence, time.time()))
                            if record.targetskill == 'end':
                                record.isactive = 0
                                user.endurance += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.endurance, time.time()))
                            if record.targetskill == 'str':
                                record.isactive = 0
                                user.strength += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.strength, time.time()))
            else:
                pass
            self.skillcheck = None


skilltime = SkillTimer()
skilltime.run()
导入线程
从app.models导入SkillTracker、UserAttributes
从flask_sqlalchemy导入sqlalchemy
从应用程序导入数据库
输入时间、数学
类SkillTimer(threading.Thread,SkillTracker):
定义初始化(self,SkillTracker=SkillTracker):
threading.Thread.\uuuuu init\uuuuuu(自)
self.skillcheck=SkillTracker.query.filter_by(isactive=1).all()
def运行(自):
尽管如此:
时间。睡眠(1)
self.skillcheck=SkillTracker.query.filter_by(isactive=1).all()
如果自我技能检查!=[]:
打印(自我技能检查)
有关self.skillcheck中的记录:
如果record.isactive==1:

如果record.timesubmit+record.timetowait现在运行此命令,则如果我们达到~950个递归,将通知您。如果我们能做到这一点,我相信问题可以归结为一次线程的数量或者类似的问题。将让您知道并接受这是否解决了问题:)谢谢您的建议。到目前为止还不错。我想你已经解决了。谢谢@codeglow会接受你的回答。
import threading
from app.models import SkillTracker, UserAttributes
from flask_sqlalchemy import SQLAlchemy
from app import db
import time, math

class SkillTimer(threading.Thread, SkillTracker):
    def __init__(self, SkillTracker=SkillTracker):
        threading.Thread.__init__(self)
        self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()
    def run(self):
        while True:
            time.sleep(1)
            self.skillcheck = SkillTracker.query.filter_by(isactive=1).all()

            if self.skillcheck != []:
                print(self.skillcheck)
                for record in self.skillcheck:
                    if record.isactive == 1:
                        if record.timesubmit + record.timetowait <= time.time():
                            user = UserAttributes.query.filter_by(user_id=record.userid).first()
                            if record.targetskill == 'int':
                                record.isactive = 0
                                user.intelligence += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.intelligence, time.time()))
                            if record.targetskill == 'end':
                                record.isactive = 0
                                user.endurance += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.endurance, time.time()))
                            if record.targetskill == 'str':
                                record.isactive = 0
                                user.strength += 1
                                db.session.commit()
                                print('User {} upgraded {}, level = {} -- {}'.format(user.user_id, record.targetskill,
                                                                                     user.strength, time.time()))
            else:
                pass
            self.skillcheck = None


skilltime = SkillTimer()
skilltime.run()