Python Thread Pool传参只一个怎么破?

2017-06-09 作者:

作为批量化操作的method,map比apply要方便简洁一些,至少不用for循环一堆东西
【注1】apply现已不用,因为实际使用基本等价于单进程操作
【注2】至于map之于map_async,及apply之于apply_async,是另外一个话题,可以参考这里
回到之前的话题,apply传参 – 可以清晰的看到,apply可以随意带args,多少个都没关系

#格式: apply(func[, args[, kwds]])
#比如
pool.apply(func=f, args=(20,30,))

而map传参 – 函数f只允许带一个参数,就是iterable里可以迭代的list
#格式: map(func, iterable[, chunksize])
#比如
pool.map(func=f, iterable=[1,2,3])

那么我们如何保留map这样的代码简洁性,同时也可以传多个参数呢?
这就用到了partial,把函数的定参放在partial内去传,变参依然iterable – 至少不需要把定参做成全局变量直接传给insert_and_process函数了
【注】对python2而言,partial只在2.7版本后支持 – 关于partial的说明在这里
from multiprocessing.dummy import Pool
from functools import partial

def insert_and_process((file_to_process,db)):
    db.table.insert(**parse_file(file_to_process))
    return True

if __name__=="__main__":
    file_list=os.listdir(".")
    db = DAL("path_to_mysql" + db)
    P = Pool(processes=4)
    P.map(partial(insert_and_process, db=db), file_list) #定参放在partial内,变参按照map标准写法去传
    P.close()
    P.join()
    print 'Done.'

有的同学可能要问 –
Q: 那如果两个(或多个)参数都是变参呢?
A: 开动一下脑筋吧 – 一起打进iterable里可好?
Q: 如果变参B与A不具备同样的iterable特性呢?
A: 擦的咧 – 那还map个毛啊。。。

完整阅读本篇»

CentOS 6.x安装新版RabbitMQ

2017-04-06 作者:

看了大半天的文章,尝试各种build(erlang,RabbitMQ),不是build不通,就是依赖不对,或者启动服务失败

完全用CentOS 6.x的默认吧,erlang是R14,RMQ版本是3.1.5,未免太老了

如何是好呢?

其实RabbitMQ官网提供了免依赖的erlang安装包,位于http://www.rabbitmq.com/releases/erlang/

wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el6.x86_64.rpm 
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.9/rabbitmq-server-3.6.9-1.el7.noarch.rpm 
yum localinstall erlang-19.0.4-1.el6.x86_64.rpm 
yum localinstall rabbitmq-server-3.6.9-1.el7.noarch.rpm

我是用马云家的CentOS镜像yum update到最新做的

安装完成后
使用6.x最常用的service rabbitmq-server start即可启动服务

rabbitmqctl  add_user userNew passNew
rabbitmqctl  set_user_tags  userNew  administrator
rabbitmqctl list_users

然后就可以使用userNew登入

http://公网IP:15672/

对MQ进行管理了

同时官网的hello world代码做简单更改,就可以在本地使用公网端MQ进行通信

credentials = pika.PlainCredentials('userNew', 'passNew') 
connection = pika.BlockingConnection(pika.ConnectionParameters('公网IP',5672,'/',credentials))

打完收工

完整阅读本篇»

录音棚初体验 | Experience of Studio

2017-02-21 作者:

Fresh experience to a professional studio, to sing something not that professional anyhow. Well, I brought back the original recording without any further post processing – some obvious flaws there, however it’s fine as first try.

偶遇良机钻了一趟录音棚,设备挺专业,唱的不专业咱也认了。

如我所料,挑战之一,木有MV提词,要对伴奏的节奏非常熟悉;挑战之二,没有KTV默认的提升效果,对嗓音颇挑战。

过程中,耳返可以即时听到自己清晰不走样的声音,第一遍出于紧张,一般不会太顺利。第二遍,放松且熟悉了设备,就好得多,全力发挥谈不上(尤其是气息的把握),勉力及格可以有。

听说专业人士都玩后期,可惜这次没有体验到,只把原声带了回来,破音和丢字都有,权且斗胆献丑好了。

(To Vivian)

 

唱歌的小黑屋(视频截图)

外边的操作间

完整阅读本篇»

新年愿望 | New Year Resolution

2017-02-02 作者:

Personal goals of 2017 listed here:

  • 高瞻远瞩 vision & foresight
  • 足额锻炼 exercise & health
  • 拥抱生活 life & family
  • 吃喝不愁 food & flavor

完整阅读本篇»

微信公号调试遇到Nginx错误499 | Nginx Code 499 on Wechat OAuth debugging

2017-01-25 作者:

最近弄了个公号测试号,尝试一下腾讯OAuth,用的还是习惯的nginx+uwsgi+flask

注意【开放平台】和【公众平台】的OAuth有差别,跳转的auth地址,及scope都是不同的;前者主要用于浏览器app(微信内置浏览器也可兼容),后者跟公众号绑定的更紧密(不关注不能auth)

这货调试蛮坑的 –

  • 首先得有公网IP,这个简单,买个按小时付费的美团云(阿里云)就行,1核1G,不要数据盘,带宽1M;一个小时0.1元多一点,一天也不到3块钱,不需要了随时可删。
  • (带备案)域名一个。这个有点难度,买云主机备案不要钱,但两周时间等的着实有点心焦。如果有现成域名,可以开个二级域名(端口依然要80),nginx转发一下,这样也是ok的。

木有用域名的时候,我尝试直接用云主机ip接测试号,一共有3处配置,都配了IP(而非域名)

  • 接口配置信息
  • JS安全域名
  • OAuth授权回调域名(关键)

但实际在微信浏览器中访问时,页面无法正常展示,这个提示很关键(转换成手机预览模式)

于是在OAuth的过程中,uwsgi经常报如下错误(而且还是在auth成功之后):

500ms的请求不算慢啊,为啥会broken pipe呢?

并且明显uwsgi返回了code 200,请求没啥问题噻?

Wed Jan 25 16:54:43 2017 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 (ip 103.37.140.18) !!! 
Wed Jan 25 16:54:43 2017 - uwsgi_response_writev_headers_and_body_do(): Broken pipe [core/writer.c line 296] during GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 (103.37.140.18) 
IOError: write error 
[pid: 24226|app: 0|req: 11/19] 103.37.140.18 () {38 vars in 892 bytes} [Wed Jan 25 16:54:42 2017] GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 => generated 0 bytes in 468 msecs (HTTP/1.1 200) 3 headers in 0 bytes (0 switches on core 0)

开始时,丈二和尚摸不着头脑,鉴于uwsgi是nginx的upstream,那就找一下nginx看人家说啥呗

一看不要紧,同一个请求,nginx code是499;google后,表明499是“客户端主动关闭连接”,那么uwsgi送给nginx的200自然木有什么卵用了 – 客户端不要了

而且这一条log是在access.log而非error.log,说明nginx并木有怪罪uwsgi

103.37.140.18 - - [25/Jan/2017:16:54:43 +0800] "GET /qrScanToTemplateMsg/6?code=0515JtlQ11sLo61riTnQ15CxlQ15Jtl1&state=1 HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.9 TBS/036903 Safari/537.36 MicroMessenger/6.5.3.980 NetType/WIFI Language/zh_CN" "-"

who to blame right now?

我开始怀疑没有域名导致的转码,找了一个备案后没用过的域名,指向这个ip,不到一分钟就生效了

然后把测试号那三处配置都改成域名,再试。。。搞定了,同一个链接,uwsgi和nginx log都是code 200.

123.151.38.94 - - [25/Jan/2017:21:17:02 +0800] "GET /qrScanToTemplateMsg/6?code=0011MCQf1s8UTv0ZMHTf1CcRQf11MCQ3&state=1 HTTP/1.1" 200 480 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC20L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.9 TBS/036903 Safari/537.36 MicroMessenger/6.5.3.980 NetType/WIFI Language/zh_CN" "120.221.74.188"

同时网页访问也展示正常了,不需要什么“转换成手机预览模式”(截图就不贴了)。

究其本质,这个nginx code# 499(以及uwsgi的broken pipe),也即客户端主动断开连接,就是ip访问状态下,微信浏览器为了安全防护,拒绝直接渲染前端页面造成的。

完整阅读本篇»

保持念想 | Always Desire

2017-01-15 作者:

Well, finally the “Walking Dead Game Season #3” arrives. Never play this series before, but I know it all, every scenes, every dialogues, every roles, by walkthrough videos. I’d like to recommend this game to everyone around since it’s the best story teller ever as I know.

It’s not exactly an action game, the most attractive parts is that it says the game adapts by player’s choices. Well, you may not expect the story could change completely after choosing an opposite answer, but the screenplay is fantastic to show you the real human nature underneath the zombie apocalypse – challenging my heart more than those Hollywood blockbusters. And this is easily to purchase, PC, Mac, iOS, Android, PS4, Xbox – available on most electronics in your hand.

Er… talking about the season #3, it’s kinda two… or half more years waiting after the season #2? I mean, it’s always good to desire, to expect even some tiny things in life. Time flies, some of them happen, and others might not, however this is how life usually goes – pretty much like the little girl Clementine in this series.

完整阅读本篇»