Topic

python

A collection of 10 issues

Python GIL锁(施工中)

1/对于一组cpu密集型任务(即假设了他们都在几乎100%用cpu无IO阻塞),总运行时间就是 每个任务的cpu执行时间求和,没有其他的。【要降低总时间,必须给更多的cpu核心,所有任务并行跑,至于选择多进程或多线程,都可以,区别是多线程开销更小多进程更安全,本来应该选多线程。但是python特殊点,由于gil, 所以多核心多线程近似等价于多核心单线程,还有额外的线程调度颠簸的开销。所以python选多进程】 【但是从用户角度】 即使是单核使用多进程,不能减少总cpu执行时间,但是时间片轮转能让所有任务都能得到调度,用户体验较好(因为如果是单线程,那下一个任务就只能等待上一个任务全部完成才能开始,) 如果是多核,每个核上跑一个任务,如果假设这些任务之间几乎是独立的(就是很少有竞争共享变量这种交互),那么就是纯粹意义上的并行。所以大家建议 设置进程数小于等于核心数,避免进程大于核心数 需要做cpu切换进程调度开销。 2/对于一组io密集型任务,每个任务的运行时间是 cpu计算时间+io时间(io时完全不需要cpu, 它就是纯粹等待数据传输直至完成,所以将它挂起剥夺cpu它还是在io等待
5 min read

[AWS][Python]使用Python自动生成CloudFormation等实现批量自动化部署AWS Canaries

需求 业务需要,想要监控一些API Endpoints(部分在AWS内网)。工具选型可参看[AWS][Elasticsearch]API Synthetics Monitoring工具的简单比较 [https://hanzhu.dev/api-synthetics-monitoring/]。最后选择的是AWS Cloudwatch Synthetics。用ApiCanaries探测,并且就success rate和duration两个metrics设置报警阈值,通知SNS。希望使用CloudFormation来Codify整个过程。 任务拆解与分析 Canary的实现 经过对手动生成的Canary的观察,发现Canary是借由lambda实现的,在console手动添加Canary后,会生成一个js的canary lambda, 而另一个相关配置的canary script (也是js, 可以自动生成或者自己写)会以layer的形式加载在js canary lambda之上,让js canary lambda来call它。 // Call customer's execution
8 min read

[AWS]S3 Bucket Notification

应内部客户要求,尝试了一下S3 bucket的通知推送,这里记录一下。 分别使用了推送到SNS Topic和推送到Lambda(之后消费Gchat webhook)。 SNS Topic S3-->Properties-->Events, Sent to SNS Topic. 需要注意的是,在SNS Topic里,需要修改policy让S3推消息,比如: { "Version": "2012-10-17", "Id": "__default_policy_ID", "Statement": [ { "Sid": "publish-from-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "SNS:Publish", "Resource": "arn:aws:sns:ap-southeast-1:xxxxxxxxx:testing-notification-hz
2 min read

由Python对数据库操作的一点展开: ORM

在上篇关于自写synthetics工具的文章里,我写入数据库采用的是psycopg2,直接写入。今天想讲一下另一种方法,ORM(Object-relational mapping)和Python里的ORM工具:SQLAlchemy。 SQLAlchemy的三个好处: * 简化db workflow * 提供ORM * 和其他Python库的集成 http://www.ruanyifeng.com/blog/2019/02/orm-tutorial.html https://hackersandslackers.com/python-database-management-sqlalchemy https://hackersandslackers.com/sqlalchemy-data-models https://hackersandslackers.com/database-queries-sqlalchemy-orm https://hackersandslackers.com/psycopg2-postgres-python/ https://www.youtube.
1 min read

[AWS]使用lambda向Slack和Google Chat推送pipeline状态

动机:在Slack Channel中显示Codepipeline的运行消息。 Feature包括: * 自动判断Account(Dev or Prod) * 用对应颜色展示管线运行成功与否 * 管线URL link * 自动提取GitHub Hash 具体实现组成部分如下: * Slack Webhook * Cloudwatch Event * Lambda (Python) Slack 准备Slack Webhook:Sending messages using Incoming Webhooks [https://api.slack.com/messaging/webhooks]。 legacy的互动方法用的是通过attachments,官方推荐的新方法是block:Creating rich message layouts [https://api.slack.com/messaging/composing/layouts]。 Cloudwatch Cloudwatch Event可以选择codepipeline作为源头,
5 min read

廖雪峰Python3教程笔记(函数式编程)

1.高阶函数 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 一个最简单的高阶函数: def add(x, y, f): return f(x) + f(y) >>>add(-5, 6, abs) 11 函数式编程就是指这种高度抽象的编程范式。 2.高阶函数:Map, Reduce Map 我们有一个函数f(x)=x^2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下: >>> def f(x): ... return x
11 min read

廖雪峰Python3教程笔记(函数与高级特性)

前言 我觉得廖雪峰前辈的Python3的教程写得很好,非常细致,与其他Tutorial相比信息量要大不少。这篇博文是我笔记的移植版,会持续更新。 正文 1.''或""本身只是一种表示方式,不是字符串的一部分 2.转义字符\ print('I\'m ok.') 3.Python还允许用r' '表示' '内部的字符串默认不转义 >>> print(r'\\\t\\') \\\t\\ 4.a = 123 # a是整数 a = 'ABC' # a变为字符串 这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言. 5.Python3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。 6.由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,
19 min read

Subscribe to 隅

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe