python版 定时任务机制
定时任务的原理
服务器执行一个python脚本
这个脚本,循环执行配置的定时任务地址
Python请求地址, 该地址应该返回, 下次再来执行的秒数. 也就是任务的频率
比如任务希望每3秒执行一次, 那么任务结束后,应该返回一个3的数字
python脚本拿到任务返回的数字, 算出下次执行任务的时间. 当时间条件满足是, python脚本会继续访问该任务
不同的任务, 直接修改 init里面的配置就可以了
python脚本如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import threading
import time
import urllib.request
import os,stat
class MyThread(object):
'''
多线程
'''
def __init__(self, func_list=None,timeout=5):
self.threads = []
self.rs = {}
self.timeout = timeout
self.func_list = func_list
self.start()
#封装的线程函数
def trace_func(self, func, name , *args, **kwargs):
ret = func(*args, **kwargs)
self.rs[name] = ret
#执行多线程
def start(self):
for v in self.func_list:
if v["args"]:
lists = []
lists.append(v["func"])
lists.append(v["name"])
for arg in v["args"]:
lists.append(arg)
tuples = tuple(lists)
t = threading.Thread(target=self.trace_func, args=tuples)
else:
t = threading.Thread(target=self.trace_func, args=(v["func"],v["name"],))
self.threads.append(t)
for t in self.threads:
t.start()
for t in self.threads:
t.join()
#t.join(self.timeout)
'''
执行任务
'''
def task(url, last_time):
#当前时间, 最后执行时间
cur_time = int(time.time())
last_time = int(last_time)
if last_time==0:
last_time = cur_time
#满足条件就执行任务
if cur_time>=last_time:
print("请求:%s"%(url))
try:
req = urllib.request.urlopen(url)
content = req.read()
content = str(content, 'utf-8')
content = content.strip()
if content.isdigit():
last_time += int(content)
else:
last_time += 1000
except:
print('发生了异常, 重置文件')
init()
return last_time
'''
多线程调用定时任务
'''
def main():
#读取文件
with open("config.txt",'r') as f:
lines = f.readlines()
f.close()
#多线程执行
func_list = []
for v in lines:
v = v.split('|')
v[1] = int(v[1])
func_list.append({"func":task,"args":(v[0], v[1]), "name":v[0]})
mt = MyThread(func_list)
d = mt.rs
#重新写入文件
content = ''
for k in d:
content += "%s|%s\n" % (k,str(d[k]))
with open("config.txt",'w') as f:
f.write(content)
f.close()
'''
初始化要执行的定时任务
'''
def init():
urls = [
'http://admin.yqxv1.local/task/withdraw',
'http://baidu.com'
]
content = ''
for v in urls:
content += "%s|%s\n" % (v,0)
with open("config.txt",'w+') as f:
f.write(content)
f.close()
os.chmod("config.txt",stat.S_IRWXU)
init()
while True:
main()
把上面代码保存为doit.py
如何把脚本跑起来, 命令流程
安装python3
ps -ef | grep python3
查看是否有进程, 如果有该进程, 可以先把进程杀了
kill -9 进程号
移除 config.txt
rm -rf config.txt
编辑你的doit.py的链接配置
sudo vim doit.py
再将定时脚本跑起来
nohup python3 doit.py >/dev/null 2>&1 &
ps -ef | grep python3 查看你的任务跑起来没有
测试反馈
在你的执行的脚本, 打印日志log_test()
python版 定时任务机制的更多相关文章
- python的反射机制
转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...
- 简单谈谈python的反射机制
转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...
- Python垃圾回收机制--完美讲解!
转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...
- 【转】简单谈谈python的反射机制
[转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- python垃圾回收机制(Garbage collection)
由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...
- 《大话设计模式》Python版代码实现
上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...
- 深入探讨 Python 的 import 机制:实现远程导入模块
深入探讨 Python 的 import 机制:实现远程导入模块 所谓的模块导入( import ),是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用. 在 Python 中使用 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
随机推荐
- JAVA多线程(二) 并发队列和阻塞队列
github代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- GraphicsLab Project学习项目
作者:i_dovelemon 日期:2016 / 05 / 30 主题:3D,Graphics 引言 进公司以来,主要在学习的就是如何保证代码的质量,以前热爱的图形学也放置了.但是,作为游戏程序员,特 ...
- C++类的默认函数
在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...
- jQuery中的.html()和.text()及.val()区别
https://www.cnblogs.com/zhang-xun/p/6766264.html
- php分页例子实现读取mysql数据分页显示
以下代码是PHP分页案例,测试通过,主要是PHP+mysql实现分页,代码来处百度空间,有兴趣看的话可以了解一下PHP是如何分页的? <?php $link = mysql_connect(&q ...
- Jamie and Binary Sequence (changed after round) - CodeForces 916B
http://codeforces.com/problemset/problem/916/B 好尬啊... #include<cstdio> #include<algorithm&g ...
- NodeJS&&前端思考
做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 ...
- empty 和 isset的区别和联系
empty 和 isset的区别和联系 要说它们的联系,其共同点就是empty()和isset()都是变量处理函数,作用是判断变量是否已经配置,正是由于它们在处理变量过程中有很大的相似性,才导致对它们 ...
- AJPFX关于部分String类方法
string类使用于描述字符串事物常见的操作:1.获取: 1.1 字符串中的包含的字符数,也就是字符串的长度 int length():获取字符串的长度 1.2 根据位置获取位置上的某 ...
- 获取父页面的dom元素
$("li.jericho_tabs", window.top.document); 上面的代码意思是获取父页面的li元素,class为jericho_tabs的所有元素.