Python中的多线程锁

发布在 python

多线程是个坑爹的课题,有多线程就有锁。Python中有低级线程模块_thread、再封装一下就是threading、再来一下就是from concurrent.futures import ThreadPoolExecutor。其中涉及到的锁大概有Lock、RLock、Condition、Semaphore、BoundedSeamphore、Event。这么多看起来怪吓人的,其实这么多的锁全部只是由Lock演化出来的

阅读全文

理解metaclass

发布在 python

metaclass一直被归类为比较高深的内容,写代码也很少会使用到metaclass。然而如果你看某些项目的源代码,还是会被绕到metaclass里面去。花一些时间理解下metaclass很有用的,因为它真的能把一条线串起来,环环相扣,所以有扎实的基础是掌握metaclass的前提,本文代码基于python3.5

阅读全文

tornado表单验证

发布在 python

工作中看到有一些不好的代码,想了个办法优化了一下,于是有了这篇博文。本文主要讲tornado的表单验证,使用的是wtforms。本文最终达到的效果是使用self.xx获取post传递过来的值。

阅读全文

很早就使用过autopep8来自动格式化代码,使用IDE的时候也会经常使用格式化代码功能让代码更符合规范一点。可是这都不是自动化的,或者说是强制的。为了保持团队的良好代码风格感觉每个同事在提交代码之前都自动进行格式化或者风格检查是一个不错的主意,于是找到了pre-commit

原理也还是很简单的,git自身提供了一些hook功能,查看git/hooks目录下会发现有一些sample文件,这样在执行commit、push、merge的时候都是可以进行一些简单的检查等功能的。然而这个设定有一个缺点。没一个hook只能执行一个文件的内容,所以要么将各种功能放在一个文件里面,或者每个功能都放置在各自的文件里面。最后由一个文件一起执行。pre-commit就解决了我们的这个文件。将不同的任务分割成单个文件。然后只需要添加别人共享的脚本就能够很快的进行commit hook了,简要使用方法例举如下

  1. 在项目根目录下编写配置文件(.pre-commit-config.yaml)

    1
    2
    3
    4
    5
    -   repo: git://github.com/pre-commit/pre-commit-hooks
    sha: v0.7.1
    hooks:
    - id: trailing-whitespace
    - id: autopep8-wrapper
  2. 进行初始化pre-commit install就可以了,以后每次执行commit的时候就会执行检查。配置文件的repo地址即为符合pre-commit框架的地址,id即为提供的功能~~,还是很好理解的。例如以上提供的autopep8-wrapper就可能够配置pep8规范进行一些代码风格检查,如果不符合风格就会自动格式化。pep8工具的默认配置文件是~/.config/pep8

参考

About style guide of python and linter tool. pep8, pyflakes, flake8, haking, Pyling.

评论和共享

supervisor遇到的坑

发布在 python

写几条自己用supervisor遇到的一些小坑

  1. Python 3 Wall的反派代表,一直不能使用python3安装
  2. 对中文输出支持奇差,估计是使用python2造成的,举个例子,假如你要在python2里面print输出一个unicode中文字符。我试了各种办法,均无解(和supervisor使用子进程运行程序的策略有关),好在使用logging模块输出中文居然没啥问题-_-,正式运行环境也是全部使用logging代替print
  3. 即使用python3,输出中文也会遇到问题,需要在配置文件添加environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"解决
  4. 写配置文件的时候一个变量不能配置多行,我一开始因为environment太长。写了2行,导致后面的没生效,折腾好久
  5. 修改supervisor配置文件后,如果配置文件错了,不会报错!而且supervisor没有工具能对配置文件的正确性进行检查,灰常操蛋啊!
  6. supervisor可以检查到异常自动重启并设置最大重启次数,可是有时候会造成无限重启这种情况。因为重启后立刻退出才会触发最大重启次数机制,假如程序一直是运行了十分钟自动退出。那么会造成无限重启,可以使用它的api写一个脚本监控这种情况,进行警告
1
2
3
4
5
6
7
8
9
10
11
import xmlrpc.client

def list_time(name: str, interval: int, times: int):
s = xmlrpc.client.ServerProxy('http://localhost:9001')
if s.supervisor.getProcessInfo(name).get('statename') != 'RUNNING':
return False
context = s.supervisor.readLog(0, 10 * 1024 * 100)
context = filter(lambda x: name in x and 'spawn' in x, context.splitlines())
context = map(lambda x: datetime.strptime(x[:19], '%Y-%m-%d %H:%M:%S'), context)
context = list(filter(lambda x: x + timedelta(minutes=interval) > datetime.now(), context))
return (len(context) > times) and len(context)

参考

也谈 Python 的中文编码处理

评论和共享

ficapy

author.bio


author.job


深圳