分类 Python 下的文章

任务调度是后端重要的组成部分,用于的场景非常广泛,比如生产系统中跑一些定时任务,涉及到上千台机器管理就很困难;Web应用中用户触发的操作比较耗时,这部分可以放到异步任务中处理;离线数据处理多个任务,并且任务间直接有依赖关系...

分布式任务调度通常有以下几类实现方式,一类是基于机器调度的方式,如CT(Contab Task),百度内部是这种方式,定时执行指定机器上的具体指令,通常需要先把任务脚本发布到具体机器,提供给机器调度(worker);第二类如Gearman/Celery,Client将任务发送给Job Server,Server根据后端负载情况,将任务投递到Worker;还有一类是编程框架层面提供的Schedule,功能相对局限,比如只能当前这台机器执行,当前机器挂了,任务也就挂了。

目前自己工作内容涉及到不少离线数据计算,这类任务是基于Python实现,公司内部现用调度系统对非Java支持不完善,而离线任务较多,其中任务间还有依赖关系,使用系统自带的Contab,不管从任务稳定性,还是任务间依赖关系的处理都不完善,最终选择部署Celery集群作为离线任务调度框架。Celery是一个专注于实时处理的任务队列,同时也支持任务调度,配套的任务监控也很完善,可以使用Flower作为可视化监控工具。

- 阅读剩余部分 -

Python中的字符串编码是一个很让初学者费解头疼的问题,特别是遇到中文时相关处理经常抛出Exception。字符串到底以什么编码在Python内部进行处理,Python2.x中文编码如何安全的转换,Python 2.x与Python 3.x在编码方面的区别?本文接下来会一一进行讲解。

logo-python.png

1、字符串在Python内部的编码
在Python内部字符串都是以unicode编码进行处理,即源码文件中的字符串首先都会被decode成unicode编码的字符串,之后Python内部再进行处理,用代码显示表示如下:

unicode_str = input_str.decode('utf8')

以上是将uft8编码的字符串input_str转换为unicode,decode成功的前提是你得知道input_str的原始编码,比如这里是utf8,否则会抛出UnicodeDecodeError的异常。

2、Python源码字符串的编码
Python 2.x的默认编码格式是ascii,字符串在转换前均会decode成unicode。初学Python大家可能会编写如下的代码:

#!/usr/bin/python
s = '你好'
print s

会出现下面的异常:

SyntaxError: Non-ASCII character '\xe4'

这个是因为错误的将utf8编码的中文当成ascii解码。解决方法也很常规:在Python源码文件中声明编码格式,最常见的声明方式如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

- 阅读剩余部分 -

Protobuf全称Google Protocol Buffers,Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

一、什么是序列化?
序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易。不同的计算机语言中,数据结构,对象以及二进制串的表示方式并不相同,序列化为的是解决跨语言、跨平台的通讯问题。序列化后的数据当然不能是某种语言的特殊数据类型,常用的序列化协议有XML、JSON、Protobuf等。

  • 序列化: 将数据结构或对象转换成二进制串的过程。
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

- 阅读剩余部分 -