首页
直播
壁纸
友链
Search
1
一个超好用的图床
5,193 阅读
2
网页版朋友圈程序 – LAN (现已发布)
2,695 阅读
3
给大家分享几个实用网站
1,409 阅读
4
超简洁的个人主页引导页 全网首发
1,232 阅读
5
域名在QQ内打开提示'非官方页面'的解决方法
1,032 阅读
休闲娱乐
资源分享
编程技术
人工智能
登录
Search
标签搜索
python
苏画
个人导航
资源分享
个人主页
教程
苏画主页
Github
人脸识别
宝塔
爬虫
api
接口
苏画导航
导航
苏画个人导航
苏画个人主页
白嫖
opencv
微博
苏画
累计撰写
51
篇文章
累计收到
607
条评论
首页
栏目
休闲娱乐
资源分享
编程技术
人工智能
页面
直播
壁纸
友链
搜索到
23
篇与
编程技术
的结果
2021-03-26
PHP为任意页面设访问密码,需要登录才能访问
使用方法把下面的代码存为php文件,下面的整段代码是验证过程,然后在你入口页进行调用例如命名为MkEncrypt.php,那么在入口页进行require_once('MkEncrypt.php');然后设置密码为MkEncrypt('1234');此时密码为1234则密码正确才能进去页面,进入后会存下cookies值,下一次登录的时候则不需要再次输入了;如果不想给人看了,只需要更改密码,cookies就会立即失效,必须要重新登陆才能看。代码简介为你的页面 支持 加密访问 无论什么程序 只要是PHP程序 都是支持这代码的 来实现加密访问你的加密页面 或文章等等的页面 不保证其他程序可以正常使用 麻烦先测试!代码如下<?php /******************************************** * 使用方法: * * 1、将本段代码保存为 MkEncrypt.php * * 2、在要加密的页面前面引入这个 php 文件 * require_once('MkEncrypt.php'); * * 3、设置页面访问密码 * MkEncrypt('页面密码'); * ********************************************/ // 密码 Cookie 加密盐 if(!defined('MK_ENCRYPT_SALT')) define('MK_ENCRYPT_SALT', 'Kgs$JC!V'); /** * 设置访问密码 * * @param $password 访问密码 * @param $pageid 页面唯一 ID 值,用于区分同一网站的不同加密页面 */ function MkEncrypt($password, $pageid = 'default') { $pageid = md5($pageid); $md5pw = md5(md5($password).MK_ENCRYPT_SALT); $postpwd = isset($_POST['pagepwd']) ? addslashes(trim($_POST['pagepwd'])) : ''; $cookiepwd = isset($_COOKIE['mk_encrypt_'.$pageid]) ? addslashes(trim($_COOKIE['mk_encrypt_'.$pageid])) : ''; if($cookiepwd == $md5pw) return; // Cookie密码验证正确 if($postpwd == $password) { // 提交的密码正确 setcookie('mk_encrypt_' . $pageid, $md5pw, time() + 3600000, '/'); return; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="renderer" content="webkit"> <meta name="author" content="mengkun"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>该页面已被加密</title> <style type="text/css"> *{font-family:"Microsoft Yahei",微软雅黑,"Helvetica Neue",Helvetica,"Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;box-sizing:border-box;margin:0px;padding:0px;font-size:14px;-webkit-transition:.2s;-moz-transition:.2s;-ms-transition:.2s;-o-transition:.2s;transition:.2s} html,body{width:100%;height:100%} body{background-color:#F4F6F9;color:#768093} input,button{font-size:1em;border-radius:3px;-webkit-appearance:none} input{width:100%;padding:5px;box-sizing:border-box;border:1px solid #e5e9ef;background-color:#f4f5f7;resize:vertical} input:focus{background-color:#fff;outline:none} button{border:0;background:#6abd09;color:#fff;cursor:pointer;opacity:1;user-select:none} button:hover,button:focus{opacity:.9} button:active{opacity:1} .main{width:100%;max-width:500px;height:300px;padding:30px;background-color:#fff;border-radius:2px;box-shadow:0 10px 60px 0 rgba(29,29,31,0.09);transition:all .12s ease-out;position:absolute;left:0;top:0;bottom:0;right:0;margin:auto;text-align:center} .alert{width:80px} .mk-side-form{margin-bottom:28px} .mk-side-form input{float:left;padding:2px 10px;width:77%;height:37px;border:1px solid #ebebeb;border-right-color:transparent;border-radius:2px 0 0 2px;line-height:37px} .mk-side-form button{position:relative;overflow:visible;width:23%;height:37px;border-radius:0 2px 2px 0;text-transform:uppercase} .pw-tip{font-weight:normal;font-size:26px;text-align:center;margin:25px auto} #pw-error {color: red;margin-top: 15px;margin-bottom: -20px;} .return-home{text-decoration:none;color:#b1b1b1;font-size:16px} .return-home:hover{color:#1E9FFF;letter-spacing:5px} </style> </head> <body> <div class="main"> <svg class="alert" viewBox="0 0 1084 1024" xmlns="http://www.w3.org/2000/svg" width="80" height="80"> <defs><style/></defs> <path d="M1060.744 895.036L590.547 80.656a55.959 55.959 0 0 0-96.919 0L22.588 896.662a55.959 55.959 0 0 0 48.43 83.907h942.14a55.959 55.959 0 0 0 47.525-85.534zm-470.619-85.172a48.008 48.008 0 1 1-96.015 0v-1.567a48.008 48.008 0 1 1 96.015 0v1.567zm0-175.345a48.008 48.008 0 1 1-96.015 0V379.362a48.008 48.008 0 1 1 96.015 0v255.157z" fill="#FF9800"/> </svg> <form action="" method="post" class="mk-side-form"> <h2 class="pw-tip">该页面已被加密</h2> <input type="password" name="pagepwd" placeholder="请输入访问密码查看" required><button type="submit">提交</button> <?php if($postpwd): ?> <p id="pw-error">Oops!密码不对哦~</p> <script>setTimeout(function() {document.getElementById("pw-error").style.display = "none"}, 2000);</script> <?php endif; ?> </form> <a href="/" class="return-home" title="点击回到网站首页">- 返回首页 - </a> </div> </body> </html> <?php exit(); }文件下载如果还是不会就直接下载这个加密文件 然后上传到你的服务器调用{cloud title="点击下载" type="lz" url="https://suua.lanzoui.com/iu8b3nbrj8d" password=""/}在要加密的页面前面引入这个 php 文件require_once('MkEncrypt.php'); //引入加密文件,如果这个引入无效可以使用:include("MkEncrypt.php"); 来引入(注意文件目录正确) MkEncrypt('123456'); //访问当前页面的密码(这里密码为123456 自行修改即可)
2021年03月26日
201 阅读
0 评论
1 点赞
2021-01-06
PHP MyaAmin 在服务器上检测到错误,请查看窗口底部-解决方法
使用phpmyadmin一直提示这个警告,看着难受:解决:修改文件:/etc/phpmyadmin/config.inc.php在最后添加这一句:$cfg['SendErrorReports'] = 'never';
2021年01月06日
212 阅读
0 评论
0 点赞
2021-01-04
支付宝当面付(PHP Demo)小白教程
1.先找到蚂蚁金服开发平台下载Demo(地址:https://docs.open.alipay.com/194/105201/)2.用支付宝工具去生成一个公钥和私钥(工具地址:https://docs.open.alipay.com/291/105971/)3.把下载下来的Demo解压后打开config.php文件把生成的私钥跟支付宝给你的支付宝公钥填写上。注意的是私钥生成的时候要把私钥保存好。(文件位置:dangmianfu_demo_php/f2fpay/config)3.1)这里是查看自己的APP_ID和支付公钥(地址:https://openhome.alipay.com/platform/keyManage.htm)4.现在开打f2fpay/qrpay_test.php文件这里可以把一些不需要的参数可以去掉(把必填的参数留住就行)4.1)填写完成后接下来就可以测试一下了,下面是访问我的本地测试地址(localhost/ailpay/dangmianfu_demo_php/f2fpay/qrpay_test.php)4.2)点击确定后如果成功了就会返回二维码地址给你注意:如果失败不返回就去检查一下你的公钥和私钥APP_ID是否正确4.3)返回的二维码地址是访问不到二维码的。需要用工具生成。这里我使用的是phpqrcode (下载地址:https://sourceforge.net/projects/phpqrcode/)下载下来以后把phpqrcode.php文件拖到你的项目目录里面。在f2fpay/qrpay_test.php文件里面加载工具文件进来。4.4)点击确定后如果成功了就会返回支付宝二维码给你看看扫出的钱是否与你填写的金额相同就行。5.回调方法5.1)自己写一个回调方法然后在config.php配置文件里面填写好。5.2)还需要在 f2fpay/service/AlipayTradeService.php文件中添加回调信息。5.3)回调方法用于如果支付成功就会给返回订单号。根据订单号更改订单状态即可。6.接下来就是需要把logo加入到二维码中间和把图片保存到本地的。6.1)在f2fpay/qrpay_test.php文件中生成二维码成功的时候来对图片处理,首先准备好需要放到二维码中间的logo图片存放到项目的某个目录下。蚂蚁技术支持中心-故障排查云排查
2021年01月04日
332 阅读
0 评论
2 点赞
2021-01-03
解决jsdelivr+github图床访问失效问题
问题描述:如果太久没更新github仓库,可能会导致原本已经上传了好久的一些图片访问失效。报错如下:Package size exceeded the configured limit of 50 MB. Try https://github.com/LuckyZmj/imgbed/tree/master/posts/20201102202808.png instead.解决方法:在jsdelivr图片链接中的github仓库名后添加@master即可例子:以github仓库名为imgbed为例 访问失效的图片链接: https://cdn.jsdelivr.net/gh/LuckyZmj/imgbed/posts/20201102202808.png 添加@master后的链接: https://cdn.jsdelivr.net/gh/LuckyZmj/imgbed@master/posts/20201102202808.png
2021年01月03日
323 阅读
0 评论
0 点赞
2021-01-02
宝塔nginx配置文件伪静态,隐藏index.php
可以直接修改配置文件,如下图.找到/www/server/panel/vhost/rewrite/你的域名.conf编辑这个文件,里面内容为location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; } }当然,也可以在宝塔后台,网站列表,设置中添加伪静态或网站管理中设置另外.宝塔nginx的配置文件在/www/server/panel/vhost/nginx 这里修改
2021年01月02日
160 阅读
0 评论
0 点赞
2020-12-28
导入pygame时出现的问题:显示版本号和欢迎界面
导入pygame时出现的问题,见下方代码>>> import pygame pygame 1.9.4 Hello from the pygame community. https://www.pygame.org/contribute.html不是报错, 仅仅只是欢迎而已, 如果你不想看到欢迎语句, 以下会教你如何删去这两句话:找到你Python的安装路径, 按照下图的路径, 找到这个__init__.py文件:以任意文本编辑器(此处是notepad++)打开找到最后两行, 注释掉, 按ctrl+s即可:再次导入,就没有欢迎语句了:彩蛋!!放上pygame中__init__.py中的结语:Thanks for supporting pygame. Without support now, there won't be pygame later.
2020年12月28日
85 阅读
0 评论
0 点赞
2020-12-28
Python多线程并发实例及其优化
这篇文章主要介绍了python多线程并发实例及其优化,threading是扩展模块,在thread的基础上进行了封装及改进。所以只需要使用threading这个模块就能完成并发的测试,需要的朋友可以参考下单线程执行python的内置模块提供了两个内置模块:thread和threading,thread是源生模块,threading是扩展模块,在thread的基础上进行了封装及改进。所以只需要使用threading这个模块就能完成并发的测试实例创建并启动一个单线程import threading def myTestFunc(): print("我是一个函数") t = threading.Thread(target=myTestFunc) # 创建一个线程 t.start() # 启动线程执行结果C:\Python36\python.exe D:/MyThreading/myThread.py 我是一个线程函数 Process finished with exit code 0其实单线程的执行结果和单独执行某一个或者某一组函数结果是一样的,区别只在于用线程的方式执行函数,而线程是可以同时执行多个的,函数是不可以同时执行的。多线程执行上面介绍了单线程如何使用,多线程只需要通过循环创建多个线程,并循环启动线程执行就可以了实例import threading from datetime import datetime def thread_func(): # 线程函数 print('我是一个线程函数', datetime.now()) def many_thread(): threads = [] for _ in range(10): # 循环创建10个线程 t = threading.Thread(target=thread_func) threads.append(t) for t in threads: # 循环启动10个线程 t.start() if __name__ == '__main__': many_thread()执行结果C:\Python36\python.exe D:/MyThreading/manythread.py 我是一个线程函数 2019-06-23 16:54:58.205146 我是一个线程函数 2019-06-23 16:54:58.205146 我是一个线程函数 2019-06-23 16:54:58.206159 我是一个线程函数 2019-06-23 16:54:58.206159 我是一个线程函数 2019-06-23 16:54:58.206159 我是一个线程函数 2019-06-23 16:54:58.207139 我是一个线程函数 2019-06-23 16:54:58.207139 我是一个线程函数 2019-06-23 16:54:58.207139 我是一个线程函数 2019-06-23 16:54:58.208150 我是一个线程函数 2019-06-23 16:54:58.208150 Process finished with exit code 0通过循环创建10个线程,并且执行了10次线程函数,但需要注意的是python的并发并非绝对意义上的同时处理,因为启动线程是通过循环启动的,还是有先后顺序的,通过执行结果的时间可以看出还是有细微的差异,但可以忽略不记。当然如果线程过多就会扩大这种差异。我们启动500个线程看下程序执行时间实例import threading from datetime import datetime def thread_func(): # 线程函数 print('我是一个线程函数', datetime.now()) def many_thread(): threads = [] for _ in range(500): # 循环创建500个线程 t = threading.Thread(target=thread_func) threads.append(t) for t in threads: # 循环启动500个线程 t.start() if __name__ == '__main__': start = datetime.today().now() many_thread() duration = datetime.today().now() - start print(duration)执行结果0:00:00.111657 Process finished with exit code 0500个线程共执行了大约0.11秒那么针对这种问题我们该如何优化呢?我们可以创建25个线程,每个线程执行20次线程函数,这样在启动下一个线程的时候,上一个线程已经在循环执行了,这样就大大减少了并发的时间差异优化import threading from datetime import datetime def thread_func(): # 线程函数 print('我是一个线程函数', datetime.now()) def execute_func(): for _ in range(20): thread_func() def many_thread(): start = datetime.now() threads = [] for _ in range(25): # 循环创建500个线程 t = threading.Thread(target=execute_func) threads.append(t) for t in threads: # 循环启动500个线程 t.start() duration = datetime.now() - start print(duration) if __name__ == '__main__': many_thread()输出结果(仅看程序执行间隔)0:00:00.014959 Process finished with exit code 0后面的优化执行500次并发一共花了0.014秒。比未优化前的500个并发快了几倍,如果线程函数的执行时间比较长的话,那么这个差异会更加显著,所以大量的并发测试建议使用后者,后者比较接近同时“并发”守护线程多线程还有一个重要概念就是守护线程。那么在这之前我们需要知道主线程和子线程的区别,之前创建的线程其实都是main()线程的子线程,即先启动主线程main(),然后执行线程函数子线程。那么什么是守护线程?即当主线程执行完毕之后,所有的子线程也被关闭(无论子线程是否执行完成)。默认不设置的情况下是没有守护线程的,主线程执行完毕后,会等待子线程全部执行完毕,才会关闭结束程序。但是这样会有一个弊端,当子线程死循环了或者一直处于等待之中,则程序将不会被关闭,被被无限挂起,我们把上述的线程函数改成循环10次, 并睡眠2秒,这样效果会更明显import threading from datetime import datetime import time def thread_func(): # 线程函数 time.sleep(2) i = 0 while(i < 11): print(datetime.now()) i += 1 def many_thread(): threads = [] for _ in range(10): # 循环创建500个线程 t = threading.Thread(target=thread_func) threads.append(t) for t in threads: # 循环启动500个线程 t.start() if __name__ == '__main__': many_thread() print("thread end")执行结果C:\Python36\python.exe D:/MyThreading/manythread.py thread end 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.468612 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.469559 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.470556 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.471554 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.472557 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.473548 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.474545 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.475552 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.476548 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 2019-06-23 19:08:00.477546 Process finished with exit code 0根据上述结果可以看到主线程打印了“thread end”之后(主线程结束),子线程还在继续执行,并未随着主线程的结束而结束下面我们通过 setDaemon方法给子线程添加守护线程,我们把循环改为死循环,再来看看输出结果(注意守护线程要加在start之前)import threading from datetime import datetime def thread_func(): # 线程函数 i = 0 while(1): print(datetime.now()) i += 1 def many_thread(): threads = [] for _ in range(10): # 循环创建500个线程 t = threading.Thread(target=thread_func) threads.append(t) t.setDaemon(True) # 给每个子线程添加守护线程 for t in threads: # 循环启动500个线程 t.start() if __name__ == '__main__': many_thread() print("thread end")输出结果2019-06-23 19:12:35.564539 2019-06-23 19:12:35.564539 2019-06-23 19:12:35.564539 2019-06-23 19:12:35.564539 2019-06-23 19:12:35.564539 2019-06-23 19:12:35.564539 2019-06-23 19:12:35.565529 2019-06-23 19:12:35.565529 2019-06-23 19:12:35.565529 thread end Process finished with exit code 0通过结果我们可以发现,主线程关闭之后子线程也会随着关闭,并没有无限的循环下去,这就像程序执行到一半强制关闭执行一样,看似暴力却很有用,如果子线程发送一个请求未收到请求结果,那不可能永远等下去,这时候就需要强制关闭。所以守护线程解决了主线程和子线程关闭的问题。阻塞线程上面说了守护线程的作用,那么有没有别的方法来解决上述问题呢? 其实是有的,那就是阻塞线程,这种方式更加合理,使用join()方法阻塞线程,让主线程等待子线程执行完成之后再往下执行,再关闭所有子线程,而不是只要主线程结束,不管子线程是否执行完成都终止子线程执行。下面我们给子线程添加上join()(主要join要加到start之后)import threading from datetime import datetime import time def thread_func(): # 线程函数 time.sleep(1) i = 0 while(i < 11): print(datetime.now()) i += 1 def many_thread(): threads = [] for _ in range(10): # 循环创建500个线程 t = threading.Thread(target=thread_func) threads.append(t) t.setDaemon(True) # 给每个子线程添加守护线程 for t in threads: # 循环启动500个线程 t.start() for t in threads: t.join() # 阻塞线程 if __name__ == '__main__': many_thread() print("thread end")执行结果程序会一直执行,但是不会打印“thread end”语句,因为子线程并未结束,那么主线程就会一直等待。疑问:有人会觉得这和什么都不设置是一样的,其实会有一点区别的,从守护线程和线程阻塞的定义就可以看出来,如果什么都没设置,那么主线程会先执行完毕打印后面的“thread end”,而等待子线程执行完毕。两个都设置了,那么主线程会等待子线程执行结束再继续执行。而对于死循环或者一直等待的情况,我们可以给join设置超时等待,我们设置join的参数为2,那么子线程会告诉主线程让其等待2秒,如果2秒内子线程执行结束主线程就继续往下执行,如果2秒内子线程未结束,主线程也会继续往下执行,执行完成后关闭子线程输出结果import threading from datetime import datetime import time def thread_func(): # 线程函数 time.sleep(1) i = 0 while(1): print(datetime.now()) i += 1 def many_thread(): threads = [] for _ in range(10): # 循环创建500个线程 t = threading.Thread(target=thread_func) threads.append(t) t.setDaemon(True) # 给每个子线程添加守护线程 for t in threads: # 循环启动500个线程 t.start() for t in threads: t.join(2) # 设置子线程超时2秒 if __name__ == '__main__': many_thread() print("thread end")你运行程序后会发现,运行了大概2秒的时候,程序会数据“thread end” 然后结束程序执行, 这就是阻塞线程的意义,控制子线程和主线程的执行顺序总结最好呢,再次说一下守护线程和阻塞线程的定义1.守护线程:子线程会随着主线程的结束而结束,无论子线程是否执行完毕2.阻塞线程:主线程会等待子线程的执行结束,才继续执行以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
2020年12月28日
165 阅读
0 评论
0 点赞
2020-12-28
Python压力测试脚本CPU
#!/usr/bin/env python3 import time import urllib.request import threading from time import sleep # 性能测试页面 PERF_TEST_URL = "目标域名" # 配置:模拟运行状态 THREAD_NUM = 1200 # 并发线程总数 ONE_WORKER_NUM = 100 # 每个线程的循环次数 LOOP_SLEEP = 0.1 # 每次请求时间间隔(秒) # 出错数 ERROR_NUM = 0 #具体的处理函数,负责处理单个任务 def doWork(index): t = threading.currentThread() try: html = urllib.request.urlopen(PERF_TEST_URL).read() except Exception as e: print(e) global ERROR_NUM ERROR_NUM += 1 def working(): t = threading.currentThread() # print( "["+t.name+"] Sub Thread Begin" ) i = 0 while i < ONE_WORKER_NUM: i += 1 doWork(i) sleep(LOOP_SLEEP) # print( "["+t.name+"] Sub Thread End" ) def main(): t1 = time.time() Threads = [] # 创建线程 for i in range(THREAD_NUM): t = threading.Thread(target=working, name="T"+str(i)) t.setDaemon(True) Threads.append(t) for t in Threads: t.start() for t in Threads: t.join() print( "main thread end" ) t2 = time.time() print( "========================================" ) print( "URL:", PERF_TEST_URL ) print( "任务数量:", THREAD_NUM, "*", ONE_WORKER_NUM, "=", THREAD_NUM*ONE_WORKER_NUM ) print( "总耗时(秒):", t2-t1 ) print( "每次请求耗时(秒):", (t2-t1) / (THREAD_NUM*ONE_WORKER_NUM) ) print( "每秒承载请求数:", 1 / ((t2-t1) / (THREAD_NUM*ONE_WORKER_NUM)) ) print( "错误数量:", ERROR_NUM ) if __name__ == "__main__": main()
2020年12月28日
109 阅读
0 评论
0 点赞
2020-12-28
Python接口压力测试
1、单进程多线程模式# #!/usr/bin/env python # # -*- coding:utf-8 -*- import time import logging import requests import threading from concurrent import futures # download_url = 'http://192.168.188.110:8081//workspace/record_download/polls/82003533467_18b305da-e313-11e8-aa39-00163e0a6bde.mp3' # download_url = 'http://192.168.188.110:8081//workspace/record_download/polls/test.log' download_url = 'http://192.168.188.110:8081//workspace/record_download/polls/9921_057128214999_18210532807_20181113110420_00163e104dbfbb8b11e8e6f0d0990876(3).wav' workers = 1000 mutex = threading.Lock() session = requests.Session() contain = {'average_cost':0,'min_cost':0,'max_cost':0,'hit_count':0} def handle(cost): with mutex: min_cost = contain['min_cost'] max_cost = contain['max_cost'] hit_count = contain['hit_count'] average_cost = contain['average_cost'] if min_cost == 0: contain['min_cost'] = cost if min_cost > cost: contain['min_cost'] = cost if max_cost < cost: contain['max_cost'] = cost average_cost = (average_cost*hit_count + cost) / (hit_count + 1) hit_count +=1 contain['average_cost'] = average_cost contain['hit_count'] = hit_count logging.info(contain) def download_one(): while True: try: stime = time.time() request = requests.Request(method='GET', url=download_url,) prep = session.prepare_request(request) response = session.send(prep, timeout=100) etime = time.time() # print(response.content) logging.info('thread[%s] status[%s] cost[%s]',threading.current_thread().ident, response.status_code,etime-stime) handle(float(etime-stime)) except Exception as e: logging.error(e) print(e) def main(): with futures.ThreadPoolExecutor(workers) as executor: for i in range(workers): executor.submit(download_one) if __name__ == '__main__': logging.basicConfig(filename="client.log", level=logging.INFO, format="%(asctime)s [%(filename)s:%(lineno)d] %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") main()2、多进程多线程模式# #!/usr/bin/env python # # -*- coding:utf-8 -*- import os import time import logging import requests import threading from multiprocessing import Lock,Manager from concurrent import futures download_url = 'http://192.168.188.105:8888' workers = 250 cpu_count = 4 session = requests.Session() def handle(cost,mutex,contain): with mutex: min_cost = contain['min_cost'] max_cost = contain['max_cost'] hit_count = contain['hit_count'] average_cost = contain['average_cost'] if min_cost == 0: contain['min_cost'] = cost if min_cost > cost: contain['min_cost'] = cost if max_cost < cost: contain['max_cost'] = cost average_cost = (average_cost*hit_count + cost) / (hit_count + 1) hit_count +=1 contain['average_cost'] = average_cost contain['hit_count'] = hit_count logging.info(contain) def download_one(mutex,contain): while True: try: stime = time.time() request = requests.Request(method='GET', url=download_url,) prep = session.prepare_request(request) response = session.send(prep, timeout=50) etime = time.time() print(response.status_code) logging.info('process[%s] thread[%s] status[%s] cost[%s]',os.getpid(),threading.current_thread().ident, response.status_code,etime-stime) handle(float(etime-stime),mutex,contain) # time.sleep(1) except Exception as e: logging.error(e) print(e) def new_thread_pool(mutex,contain): with futures.ThreadPoolExecutor(workers) as executor: for i in range(workers): executor.submit(download_one,mutex,contain) def subprocess(): manager = Manager() mutex = manager.Lock() contain = manager.dict({'average_cost': 0, 'min_cost': 0, 'max_cost': 0, 'hit_count': 0}) with futures.ProcessPoolExecutor(cpu_count) as executor: for i in range(cpu_count): executor.submit(new_thread_pool,mutex,contain) if __name__ == '__main__': logging.basicConfig(filename="client.log", level=logging.INFO, format="%(asctime)s [%(filename)s:%(lineno)d] %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]") subprocess()
2020年12月28日
238 阅读
0 评论
0 点赞
2020-12-26
python打包成exe可执行文件教程
本文,介绍一下把python代码打包成windows的可执行文件的方法。步骤1安装pywin32,可以参考《怎么给python安装pywin32模块?》一定要注意对应的python版本,否则不能安装。步骤2用命令行调用pip安装pyinstaller。步骤3准备一个py文件。我这里准备的是一个爬取电子书的python文件——00.py。步骤4准备一个图片,作为exe的图标:b.ico注意图片格式是ico的,大小为32*32,不要太大。没有的话,可以在网上免费转格式。把00.py和b.ico放到一个目录里面——C:\a步骤5把cmd的当前目录切换到C:\a。步骤6然后执行命令行:pyinstaller -F -i b.ico 00.py注意:文件名后面不要有后缀,直接00和b步骤7运行之后,cmd变成了这样。步骤8在C:\a目录里面,多出了几个文件夹。可执行文件00.exe就在dist文件夹里面。步骤9双击可执行文件,会弹出一个命令提示符端口,提示你输入书号。按照格式输入书号,点击回车键,就可以在dist文件夹里面,看到一章章的电子书被下载下来了。exe的图标,一定要是ico格式。
2020年12月26日
112 阅读
0 评论
0 点赞
1
2
3