当前位置: 首页 > 编程日记 > 正文

flask异步操作_Python Flask后端异步处理(三)

前一篇博文我们已经将基础知识和环境配置进行了介绍:

首先编写一个celerytask.py文件进行Celery的配置,同时耗时任务也写在该文件中

from celery import Celery

from init import app

from SZheConsole import SZheScan

app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'

app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'

celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])

celery.conf.update(app.config)

@celery.task

def SZheConsole(urls):

try:

for url in urls:

print("="*20)

print(url)

SZheScan(url)

except Exception as e:

print("错误")

print(e)

pass

print("allend!")

使用@celery.task装饰器修饰耗时函数SZheConsole,让Celery能够正确调用。

SZheScan函数是另外一个文件里面的函数,即对每一个URL进行单独的扫描,这部分过几天为了提高扫描速度会进行优化,这里将Celery用到项目里,暂时不改。

调用耗时任务SZheConsole的地方在index.py视图函数中,只选调用部分代码

@app.route('/console', methods=['GET', 'POST'])

@login_required

def console():

bugbit, bugtype = core.GetBit()

counts = core.GetCounts()

ports = core.GetPort()

services = core.GetServices()

target = core.GetTargetCount()

try:

lastscantime = BaseInfo.query.order_by(BaseInfo.id.desc()).first().date

except:

lastscantime = "暂无扫描"

pass

if request.method == 'GET':

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,

ports=ports, services=services, target=target)

else:

urls = request.form.get('urls')

urls = urls.split()

print(urls)

for url in urls:

redispool.hincrby('targetscan', 'waitcount', 1)

# executor.submit(SZheConsole, urls)

SZheConsole.delay(urls)

target = core.GetTargetCount()

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,

ports=ports, services=services, target=target)

可以看到原来的处理方式是多进程处理

executor.submit(SZheConsole, urls)

将原来的处理方式代码注释掉后,关键代码修改为

SZheConsole.delay(urls)

这样就可以将耗时任务丢给Celery进行处理,页面立即返回

return render_template('console.html', bugbit=bugbit, bugtype=bugtype, counts=counts, lastscantime=lastscantime,ports=ports, services=services, target=target)

接着启动redis和Celery服务,启动redis自不用说,Celery启动命令为:

celery worker -A celerytask.celery -l INFO

(可以看出-A参数celery与文件名的关系

运行后的部分截图为:

62844d380ba33473c713fcaf3f48ab8a.png

接着启动Flask服务,在任务控制台输入需要扫描的网址:

62ef2797f88aa506e2a490b50cea3c69.png

新建任务后查看Celery的日志信息,可以看到运行成功,同时与使用原生线程/进程一样,浏览器立即返回,异步处理成功。

3ae8c9f1549cbd004f3180e2ecd30296.png

后面的博客将学习使用Celery中更流行的用法,也是原生线程/进程很难做到的部分,如显示进度条,暂停删除任务,显示后台任务状态等。

既然使用了Celery就应当把它的威力发挥到最大,以上

且听下回 咕咕咕

参考链接:

相关文章:

Codeforces Round #308 (Div. 2) C. Vanya and Scales dfs

题目链接: http://codeforces.com/contest/552/problem/C 题意: 给你100个砝码,第i个砝码质量是w^i,然后问你能不能在有m的情况下,左边和右边都放砝码,使得这个天平平衡 题解: dfs直接暴力 对于这个砝码来说,只有3种选…

java中JVM的原理【转】

一、java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟…

switch的case使用数组C语言,使用常量数组的元素作为switch语句中的case

我正在尝试将一组按键映射到一组命令.因为我处理来自多个地方的命令,所以我想在键和命令之间设置一个抽象层,这样如果我更改底层键映射,我就不必更改很多代码.我目前的尝试看起来像这样:// input.henum LOGICAL_KEYS {DO_SOMETHING_KEY,DO_SOMETHING_ELSE_KEY,...countof_LOGIC…

PHP上传文件函数move_upload,如何使用php中move_uploaded_file函数

我们平时上传的文件保存在临时文件夹中,例如/ tmp,但临时文件夹的内容在一段时间后会被删除,因此为了将来要使用上传文件,需要将内容保存在不太可能被任意删除的专用目录中,这时就需要使用move_uploaded_file函数&…

java的标记接口_Java中的标记接口?

我被教授,Java中的Marker接口是一个空接口,用于向编译器或JVM发送信号,实现此接口的类的对象必须以特殊方式处理,如序列化,克隆等。但最近我了解到,它实际上与编译器或JVM无关。例如,在Serializ…

Java Exception

先贴上一段Exception源码注释 1 /**2 * The class {code Exception} and its subclasses are a form of3 * {code Throwable} that indicates conditions that a reasonable4 * application might want to catch.5 *6 * <p>The class {code Exception} and any subc…

c语言实验至少包括四个函数中,C语言实验报告《函数》

学号&#xff1a;__________ 姓名&#xff1a;__________ 班级&#xff1a;__________ 日期&#xff1a;__________指导教师&#xff1a;__________ 成绩&#xff1a;__________实验四 函数一、 实验目的1、掌握函数定义、调用和声明的方法2、掌握实参和形参之间的…

Android与iOS对比

最近有并行开发Android与iOS端App,想在这总结一些两种开发的相似与区别。转载于:https://www.cnblogs.com/stuwan/p/6475725.html

oracle停止一切进程,oracle启动/停止的几种方法以及 启动和停止过程中出错的解决办法...

一、启动几种方法&#xff1a;1、sqlplus /nologconnect /as sysdbastartup2、sqlplus /nologconnect /as sysdbastartup nomountalter database mountalter database open在以上两种方法中&#xff0c;1方法中的startup相当于2方法中的startup nomountalter database mountalt…

前端js判断上传是否为EXCEL表格问题

直接贴代码吧~JS部分 输入框部分&#xff1a; 转载于:https://www.cnblogs.com/aijiajia1314/p/9517541.html

java 外部类似_[求指点] 如何用java 实现类似linux中管道调用外部程序的功能

想写个小程序实现类似linux中管道的功能&#xff0c;创建一个外部子进程&#xff0c;然后主进程不断地写输入给子进程&#xff0c;而后把子进程的返回值取出。如下的小代码就是从stdin读入一个字符串&#xff0c;调用子进程(cat)返回这个串&#xff0c;然后返回。但下面的写法只…

c语言递归求五阶行列式源代码,久游堂怎么样 -官网

iOS版# -*- coding: utf-8 -*- """ author: Dell Created on Tue Dec 24 12:33:56 2019 """ import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait#等待一个元素加载完成 from selenium.webdri…

POJ - 3660 Cow Contest(flod)

题意&#xff1a;有N头牛&#xff0c;M个关系&#xff0c;每个关系A B表示编号为A的牛比编号为B的牛强&#xff0c;问若想将N头牛按能力排名&#xff0c;有多少头牛的名次是确定的。 分析&#xff1a; 1、a[u][v]1表示牛u比牛v强&#xff0c;flod扫一遍&#xff0c;可以将所有牛…

oracle scn与数据恢复,SCN与数据库恢复的关系

一。SCN与CHECKPOINTCKPT进程在checkpoint发生时&#xff0c;将当时的SCN号写入数据文件头和控制文件&#xff0c;同时通知DBWR进程将数据块写到数据文件。CKPT进程也会在控制文件中记录RBA(redo block address),以标志Recovery需要从日志中哪个地方开始。与checkpoint相关的SC…

Java 理解泛型的基本含义

Java 泛型 Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 泛型方法 你可…

java严格区分大小写吗_Java是否区分大小写?

我在某处读到Java是区分大小写的。 我一直无法证实这一点。Java源代码是区分大小写的&#xff0c;如果你的意思是。 即Double与double不是同一个types&#xff0c;并且可以有两个不同的variablesmyData和mydata 。是吗&#xff1f; 如果是这样&#xff0c;为什么&#xff1f;区…

4、Hibernate查询语句

转载于:https://www.cnblogs.com/wyl9527/p/6484099.html

循环控制体重C语言,中年以后很容易发福变胖?4个建议帮你控制体重,保持轻盈体态...

随着年龄的增长&#xff0c;尤其是40岁以后&#xff0c;我们会发现&#xff0c;对待自己的体重与身材之时会显得很无力&#xff0c;在年轻的时候&#xff0c;减掉几斤的体重并不难&#xff0c;而到了中年以后则会变得很困难&#xff0c;即使减重成功&#xff0c;也非常容易反弹…

oracle异地迁移,数据泵实现Oracle数据迁移到异地库

今天发现impdp命令有个特殊的用途&#xff0c;可以将数据库的一个用户迁移到另一台机器上的数据库的用户中。如果目标用户不存在&#xff0c;还可以对应的创建该用户。下面就来看一下命令格式&#xff1a;Impdpusername/passwddbsnameremap_schemauserA:userB remap_tablespace…

轨迹系列1——一种基于路网图层的GPS轨迹优化方案

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/ 1.背景 GPS数据正常情况下有20M左右的偏移&#xff0c;在遇到高楼和桥梁等情况下偏移会更大。本方案讨论基于路网图层如何来进行轨迹优化。 2.数据预处理…

c语言如何输出整串链表,大神帮我看一下怎么输入输出一个链表,我输入了但是没输出啊...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include //malloc头文件struct Student //定义结构体{int num;struct Student *next; //指向下一个数据节点的指针};int n;struct Student *creat() //定义建立链表的函数{n0;struct Student *p1,*p2,*head;p1p…

java基于http协议编程_Java中基于HTTP协议网络编程

java中为我们的网络支持提供了java.net包&#xff0c;能够使我们以编程的方式来访问Web服务功能&#xff0c;这篇博客&#xff0c;就跟大家分享一下&#xff0c;Java中的网络编程的知识&#xff0c;主要是学习下该java.net包下的API。URI——>URLURI:表示的是统一的资源标识…

json问题小结

json 键值对增加、删除 obj.keyvalue; // obj.keyobj[key]eval("obj."key); delete obj.key; vue中新增和删除属性 this.$set(object,key,value) this.$delete( object, key ) 触发视图更新 遍历键值 for (var key in data) {console.log(key:data[key]); //键:值 } …

windows 如何安装oracle 补丁包,Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解...

Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解第一部分&#xff1a;安装 Oracle 10.2.0.11、选择安装方法2、选择安装类型3、指定安装目录4、检查先决条件5、选择配置选项6、选择数据库配置7、指定数据库配置选项8、选择数据库管理选项9、指定数…

C++通过HTTP请求Get或Post方式请求Json数据(转)

原文网址&#xff1a;https://www.cnblogs.com/shike8080/articles/6549339.html #pragma once#include <iostream>#include <windows.h>#include <wininet.h> using namespace std; //每次读取的字节数#define READ_BUFFER_SIZE 4096 enum HttpInterfaceErr…

工厂模式 android,当Android遇见工厂模式

设计模式.png我们先看一下一个Android系统应用中的工厂模式列子&#xff0c;再讲解工厂模式。package com.android.mms.ui;import android.content.Context;import android.util.Log;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException…

抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

在工厂方法模式中&#xff0c;工厂只负责生产具体的产品&#xff0c;每一个具体的工厂对应着一个具体的产品&#xff0c;工厂方法也具有唯一性&#xff0c;如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品&#xff0c;例如&#xff1a;海尔品牌不止生产海尔TV…

npm-run 自动化

为什么使用npm run 插件不需要全局安装&#xff0c;只要安装在工程项目中&#xff0c;npm上的包提供了命令行接口&#xff0c;可以直接使用这些局部安装的插件; 举例&#xff08;babel&#xff09;&#xff1a; 在工程项目中局部安装babel、转码规则后&#xff0c;直接在终端中…

docker 安装 oracle12,使用Docker安装Oracle 12c

使用Docker安装Oracle 12c假设你的服务器已成功安装Docker&#xff0c;继续进行以下操作&#xff1a;1. 启动Docker[rootnode01 ~]# service docker start2. 从远程仓库搜索oracle image[rootnode01 ~]# docker search oracleINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDd…

python3 面向对象(一)

以Student类为例&#xff0c;定义类通过 class 关键字 class Student(object):pass class 后面紧接着是类名&#xff0c;即 Student&#xff0c;类名通常是大写开头的单词&#xff0c;紧接着是 (object)&#xff0c;表示该类是从哪个类继承下来的 >>> stu Student() …