作者的自言自语
有时候遇到大量的任务,有时候遇上庞大的数据,一台电脑处理起来太慢,所以我希望把任务下发到其他电脑去帮忙,那些电脑怎么怎么保证代码可以执行呢?简单的说怎么控制一千台电脑呢?我要他们按照我的指令去行事。
所以我要下发代码去给这些机器,这些电脑自己空降代码去跑。所以这里我选择了跨平台的python,搭造了一个可以从网上下载代码来跑的小软件
开始
我们可能每天需要做不一样的事情,所以需要能:
1.要能从网上下载代码
考虑到各个电脑系统,版本不一样,所以需要能:
2.在各种电脑上能执行
因为执行过程中可能有失败,结果如何都需要:
3.消息反馈。
我们要把代码放在脚本执行目录下一个叫做packet的子文件夹里面
第一步就是要能从这个packet文件夹里面引入模块
commn_init.py
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os
import shutil
import json
import urllib2
import traceback
import datetime
import time
# 获取当前脚本执行目录
CUR_DIR = os.getcwd()
PACKET = os.path.join(CUR_DIR,'packet')
# 这样我们就能从packet这个文件夹下引入模块了
sys.path.append(PACKET)
这是我们的通用类,之后写的脚本第一件事情就是引入这个通用类
我们在packet创建一个mymain.py里面函数如下
# -*- coding:utf-8 -*-
def main():
result = 'mymain'
print(result)
return result
由于我们之前的sys.path.append(PACKET)把packet文件夹设为python可以识别引入模块的位置,所以现在我们可以识别这里面的内容
me.py
# -*- coding:utf-8 -*-
from commn_init import *
if __name__ == '__main__':
import mymain
mymain.main()
就这样,接下来我们只要把mymain这里面的代码换成可以随时从网上下载下来的代码就可以做到动态下发代码执行了
展示一下封装成类后的代码
# -*- coding:utf-8 -*-
from commn_init import *
"""
Creater Changwei 2017/3/24 I hope YouRu
1.能够在不同平台运行,从网络上请求代码执行
2.隐藏自己,保护自己
3.改造自己,自我进化
4.完成任务,创建之初就是为了辅助我们计算大型的数据
"""
class YouRu(object):
def __init__(self):
super(YouRu, self).__init__()
# 执行的一些过程记录日志
self.Record = os.path.join(CUR_DIR,'record.txt')
# 一部分错误日志
self.Errtxt = os.path.join(CUR_DIR,'err.txt')
def use_mymain(self):
import mymain
mymain.main()
def ues_internet(self):
"""
执行网络请求 运行请求下来的代码
代码可能长期没改 所以本地要有执行后的状态记录 有成功记录就pass 可能会有过期时间 超过这个时间就pass
"""
html = urllib2.urlopen('http://localhost/youru/youru.json').read()
self.config_dic = self.get_config()
# 我把代码下载下来后保存为inter_task.py 然后import引入执行
html_dic = eval(html)
save_py = os.path.join(PACKET,'inter_task'+'.py')
f = open(save_py,'w')
f.write(html_dic['content'])
f.close()
import inter_task
result = inter_task.main()
print(result)
now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S:")
f = open(self.Record,'a')
f.write(now)
f.write(result)
f.write('\n')
f.close()
def get_config(self):
"""
本地配置信息
比如只想让这台电脑执行一次,这份代码我是不是之前执行过了,如果执行过了留个记录
"""
def make_config(config):
if not os.path.exists(PACKET):
os.makedirs(PACKET)
f = open(config,'w')
first_config_dic = {'time':time.time(),'datetime':datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S"),'exe_result':{}}
json.dump(first_config_dic,f)
f.close()
return first_config_dic
config = os.path.join(PACKET,'config.json')
config_dic = {}
if os.path.exists(config):
try:
config_dic = json.load(open(config))
except Exception, e:
config_dic = make_config(config)
else:
config_dic = make_config(config)
return config_dic
# def main():
# try:
# import mymain
# result = mymain.main()
# except Exception, e:
# traceback.print_exc(file=open(os.path.join(CUR_DIR,'err.txt'),'w'))
def main():
demo = YouRu()
tmpc = 0
while True:
try:
demo.ues_internet()
except Exception, e:
myexe = os.path.join(CUR_DIR,'out.exe')
if 10 > 1:
traceback.print_exc(file=open(demo.Errtxt,'w'))
result = open(demo.Errtxt).read()
now = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S:")
f = open(demo.Record,'a')
f.write(now)
f.write(result)
f.write('\n')
f.close()
finally:
# 创建之初循环十次结束吧 不然每次我都要打开后台任务管理系统才能结束你
print('finally')
time.sleep(1)
tmpc += 1
if tmpc > 10:
break
if __name__ == '__main__':
main()
我把代码放在网上如下 youru.json
{"content": "# -*- coding:utf-8 -*-\nimport sys\nreload(sys)\nsys.setdefaultencoding('utf-8')\n\ndef main():\n\tresult = 'second down'\n\tprint(result)\n\treturn result\n\nif __name__ == '__main__':\n\tmain()\n\t\n\n\n\n\n\n\n", "until_time": 3600, "task_id": "a001", "pyname": "inter_task", "time": 1490344778.523}
其实这就是把inter_task.py的代码读取出来,以json字典的形式下发出去
inter_task.py如果形象的列出来就是
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def main():
result = 'second down'
print(result)
return result
if __name__ == '__main__':
main()
简单的接了一个打印second down的任务来执行
但是我要控制一千台电脑,这些电脑不一定装有python环境不是吗
所以我们要打包
pyinstaller -F youru.py
打包的时候记得把packet文件夹删掉或者重命名 这样才不会这里面的模块引入
最后我们是要让打出来的exe自己去创建packet文件夹和下载代码执行的
一个简易的可以下发代码任务和执行任务的小软件就这样完成了