之前写代码的过程,用中文加了很多的注释,现在需要找出来,改掉。
可以利用正则表达式来进行搜索, 匹配中文汉字的编码就可以了。
1 | ^((?!(\*|//)).)+[\u4e00-\u9fa5] |
之前写代码的过程,用中文加了很多的注释,现在需要找出来,改掉。
可以利用正则表达式来进行搜索, 匹配中文汉字的编码就可以了。
1 | ^((?!(\*|//)).)+[\u4e00-\u9fa5] |
给朋友帮忙,想将某市医师服务协会网站上的定考模拟测评试题导出成为PDF,方便在手机上进行学习。
经过操作分析后,网页是每一道试题都是一个json数据,需要想办法直接获取所有的数据,代码没有混淆和加密,可以直接尝试调用已经存在的方法。
在console口直接执行下面的代码,在bbresult中就可以获得所有试题的数据。
1 | var bbresult = []; |
取到的结果示例:
1 | [ |
将得到的500条数据直接存在一个json文件中,命名为data.json。
利用下面的代码,就可以将这个json文件里的数据,成功的转换成带有格式的PDF文件。
1 | import json |
PDF效果非常不错,放在手机上查看清晰可读,收获范主任稀有的赞一次!
声明:代码不会对任何系统产生危害,所有的操作都是在正规注册付费账号里合规合法完成,未传播任何带有版权数据。如有侵权,请联系删除。
当前的Python Flask程序部署到包含三个pod的一个deployment中,业务中需要一个消息通知到三个pod,目前不想引入消息队列组件,所以调用现有的kubernetes python库,直接取出三个pod的IP,直接访问三遍。方法略显粗糙,虽然不优雅,但是轻量级的解决了问题。
1 | resp = requests.post(url, |
但是在调试中发现,在一个API代码中一旦发起新的request请求,系统直接卡住,甚至所有的POD IP都无法支持访问了。
这个问题,一开始的研究思路是以为循环调用一个API导致的无限循环,但是加入debug log以后并没有打出log来,看起来并不是。
最后突然想起,之前把flask的app启动方式换成了gevent.pywsgi.WSGIServer, 会不会是线程无法启动的问题。
最后查到了如下内容:
1 | gevent is a coroutine -based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev or libuv event loop. |
所以,gevent是协程级别的,那么自然就阻塞了IO,那如何解决呢?
https://www.gevent.org/api/gevent.monkey.html#module-gevent.monkey
官方提供了一个patch库。总结起来就是这样:
gevent 是一个基于协程的 Python 网络库,它使用 Greenlet 库提供了一种高效的协程实现。协程是一种轻量级的线程,允许并发执行,但没有真正的并行性。协程可 以在遇到 I/O 操作时自动地切换到其他任务,从而提高程序的并发能力。
然而,在标准的 Python 线程模型中,当一个线程遇到 I/O 操作时,它会被阻塞,直到 I/O 操作完成。这意味着在传统的多线程模型下,一个线程在等待 I/O 完成时 会占用一个线程资源,而其他线程则无法被调度执行。
monkey.patch_all() 是 gevent 提供的一个函数,用于实现对标准库的自动补丁,以便与协程一起使用。这个函数会对一些常见的阻塞式 I/O 操作进行替换,使其在 遇到阻塞时能够自动地切换到其他协程任务。
当你在执行 monkey.patch_all() 后,gevent 会修改 Python 的内置库,例如 socket、threading、time 等,以便在这些库中的 I/O 操作发生时进行协程切换。 这样一来,当使用 gevent 的 WSGIServer 启动一个服务器时,它会在遇到阻塞的 I/O 操作时自动切换到其他协程,而不会阻塞整个服务器。
总结起来,执行 monkey.patch_all() 会对 Python 的内置库进行补丁,使得在使用 gevent 的 WSGIServer 启动服务器时,能够自动地在 I/O 操作发生时切换到其 他协程,从而实现多线程的并发处理能力。这使得 gevent.pywsgi.WSGIServer 能够更高效地处理并发请求。
所以在整个flask最开始的地方加上这样一段,问题就解决了。
1 | # noinspection PyUnresolvedReferences |
同时,借这个机会,再次重温了一些线程(Process),进程(Thread)和协程(Coroutine)。这篇文章讲的挺好。
https://juejin.cn/post/7027998293351202853
有两个重要的的点:
利用Python的kubernetes库,可以查询出来某个namespace里下的pod,但是返回的结果集过于复杂,想找到其中的pod IP, 需要费点时间。
1 | all_pods = client.CoreV1Api().list_namespaced_pod( |
all_pods直接打的结果不是json,里面的None和datetime.datetime是无法被FEHelper识别的。
json直接dump的时候会报错误:TypeError: Object of type datetime is not JSON serializable。
这个时候只需要简单的加个参数就可以了。
1 | json.dumps(all_pods, sort_keys=True, default=str) |
打印出来的结果,拷贝到FEHelper然后去掉头尾的引号就可以识别了, 顺利找出pod IP的路径,拼出来想要的结果。
1 | [s['status']['pod_ip'] for s in all_pods] |
业务上需要搭建一个能推送消息的架构,现有的服务端是基于python-flask构建的。
服务端python需要集成socketio,参考这里https://github.com/miguelgrinberg/python-socketio/blob/main/examples/server/wsgi/app.py
但是需要记得async_mode改成gevent。
前端测试的代码, 需要替换一下Server IP。
1 |
|
这样就基本完成了正常环境下的websocket下的代码部分的功能。
如图所示,几条重点:
目的是让客户端Client A, B, C访问到一个POD后,以后就一直绑定到这个pod上。
需要改动的配置:
正常情况下,客户端A和B链接到第一个pod,客户端C链接到第三个pod,如果有一个时间发生在第二个POD,或者Job Pod上,是无法直接发送消息给所有的pod上的。
所以需要一个消息总线,可以选择Redis/MQ/kube-event来实现,三个API pod侦听消息队列的某个时间,所有需要发送给客户的消息直接发送给消息队列,然后消息队列转发给三个API pod,
API pod收到消息队列的提醒后,然后推送给自己链接的客户端,这样就完成了一个整体回路。
pip安装部分包的时候,会遇到下面的错误提示,这是因为缺少的C++的编译环境。
1 | error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ |
网上找到的许多信息看起来已经过期了,目前能解决的办法是,打开这个错误提示里的网站。
https://visualstudio.microsoft.com/visual-cpp-build-tools/
下载一个“Download Build Tools”, 然后安装,从里面选择“Windows”里的“Desktop development with C++”, 然后确认安装,等待就可以了。
有时候调试问题的时候,只有一份kubeconfig文件,可以根据这个文件获取当前用户的权限,方便下一步的调试。
把config文件中的client-certificate-data内容,或者.crt文件拿出来用openssl解析一下。
1 | 直接处理内容 |
openssl输出的内容里包含如下一段:
1 | Subject: O=system:masters, CN=kubernetes-admin |
这里面的O=对应的就是K8S里的Group,CN=对应的就是user, 剩下的就是cluster里去找对应rolebinding, clusterrolebinding, role和clusterrole就可以了。
工作中遇到了这么一个需求,有一段没有格式的json字符串,需要把其中的key为“name”的值改成“new-webhook-config”, 用sed可以完成这个工作。
1 | {"apiVersion":"admissionregistration.k8s.io/v1beta1","kind":"MutatingWebhookConfiguration","metadata":{"annotations":{},"name":"webhook-config"}} |
1 | sed -ri 's/(\"name\":\")[^"]*/\1new-webhook-config/g' 1.txt |
重点的是其中的\1,这里表示的第一个子串,如果没有这个\1,那么就会全部替换掉。
可以参考这里:
https://www.cnblogs.com/maxincai/p/5146338.html
Jira是不能分组统计的,只能用dashboard里用二维表格统计,但是如果查询语句是“status changed to resolved by”,统计表格里是不能显示出来“resolved by”这个用户名的。
之前同事是手动做了特别多的查询,然后把这些查询放到confluence里进行统计的,所以就想用jira api分账户统计一下,代码如下。
1 | import json |
查询后的结果:
1 | +----------+-----------------------+-------+ |
效果不错,值得分享一下。
最近写了很多的接口,需要反复处理json数据,抽离数据,重组格式。
花时间研究了一些python的列表生成,以及更高级的Map/Reduce, 并给大家分享了一下,记录一下share的过程写下的代码。
1 | from functools import reduce |