Resive world

Come world to Record life


  • Home

  • Tags

  • Categories

  • Archives

  • Sitemap

  • Search

Python多核编程分析

Posted on 2016-12-19 | In Python

简述

之前一直都用python的多线程库(比如threading)来写一些并发的代码,后来发现其实用这个方法写的程序其实并不是真正的并行(parrallel)计算,而只是利用单个CPU进行的并发(concurrency)计算。因此,多线程也仅仅只在处理一些被频繁阻塞的程序时才会有效率上的提升,比如网络爬虫里等待http返回等;而在CPU使用密集的程序里使用多线程反而会造成效率的下降。那么为什么python不把threading库设计成并发的线程呢?这是因为python本身有一个全局翻译锁,叫GIL(Global Interpreter Lock),这个锁的目的是让当前的python解释器在同一时间只能执行一条语句,从而保证程序的正确运行,这也就导致了一个python解释器只能并发处理而不能并行处理。那么,如果想并行的执行代码,显然需要开启多个python解释器,这也就不是多线程,而是多进程了,因此python在多线程库里并不支持多核处理,而是在多进程库(multiprocessing)里支持多核处理。

多线程编程:

多线程编程比较简单,主要利用threading类即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import threading

mutex = threading.Lock()

def little_thread(arg):
print 'Thread %d start.'%(arg)
mutex.acquire()
#critical area
mutex.release()
while True:
arg*=arg

def test():
threads=[]
thread_num=4
for i in range(thread_num):
t=threading.Thread(target=little_thread,args=(i,))
t.start()
threads.append(t)
for t in threads:
t.join()

if __name__=='__main__':
test()

基本用法也就是把执行逻辑的函数传给Thread对象,并用tuple的形式传进参数,然后start就可以开始线程,最后join阻塞等待线程结束。

同时,也可以自定义锁,来保护共享数据或者临界区。

这里注意到我在死循环里写的不是空语句,而是一个较为复杂的计算,这是因为如果写的不是空语句,那么操作系统可能会对线程进行优化,导致效果不理想。

我把上面的代码运行在一个四核的机器上,用htop工具查看各个cpu的占用情况:

我们发现这四个核基本只有一个核在全速运行,其他的三个核基本没有工作,这就说明了多线程其实并没有真正用到多个核。

多进程编程

多进程编程方法其实和多线程类似,只是需要注意多进程的各个子进程无法直接访问父进程内的公共变量(毕竟已经是一个独立的进程了,有自己的数据段)。为了解决这个问题,就需要用到一个Manager来管理共享变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import multiprocessing

#shared variable
output_line=multiprocessing.Manager().list()

def little_process(arg):
print 'Process %d start.'%(arg)
output_line.append(arg)
while True:
pass

def test():
processes=[]
process_num=4
for i in range(process_num):
t=multiprocessing.Process(target=little_process,args=(i,))
t.start()
processes.append(t)
for t in processes:
t.join()

if __name__=='__main__':
test()

这段代码跑出来的CPU使用率是这样的:

显然,多进程充分发挥了多核计算机的有点,对CPU密集型的程序有着极好的加速效果。

附一张爽歪歪的图(话说实验室的服务器用起来还是挺爽的):

参考资料

Python的GIL是什么鬼
threading和multiprocessing
Python多进程并发

adb(Android Debug Bridge,Android调试桥)常用命令

Posted on 2016-12-18 | In Android

说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android 调试桥,身为 Android 开发的我们,熟练使用 ADB 命令将会大大提升我们的开发效率, ADB 的命令有很多,今天就来整理下我在开发常用到的一些 ADB 命令。

Read more »

大文件分割与重组技巧

Posted on 2016-12-14 | In Linux

简述

由于各种不同的问题,我们经常会遇到需要将一个大文件分割存储的问题。比如github里单个文件大小一般不能超过100M、比如FAT32文件系统里单个文件大小不能超过4G,比如我们想把某一个数据文件分割存储和查看,比如对日志文件进行分割保存等等。

在ubuntu下,这个工作其实相当简单,只需要牵涉到两个命令:split、cat.

文件分割–split

split命令用来将一个大文件分割成多个小文件,可以固定大小分割(常用于分割二进制文件),还可以固定行数分割(常用于分割文本文件)。

按行分割

1
2
3
$ split -l 10 data subdata-
$ ls
data subdata-ab subdata-ad subdata-af subdata-ah subdata-aa subdata-ac subdata-ae subdata-ag

-l参数指定每个文件的行数,然后带分割的数据文件,以及分割后重新命名的文件前缀。默认分割出的文件是固定前缀加字典序,这样也是为了方便重组是不扰乱顺序。

按大小分割

1
$ split -b 10M data subdata-

-b参数指定用二进制分割,也就是指定文件大小,剩下的与按行分割类似。

用数字后缀

如果不喜欢英文字母后缀,我们可以用-d参数表示我们期望用数字来表示顺序。

1
2
3
$ split -d -l 10 data subdata-
$ ls
data subdata-00 subdata-01 subdata-02 subdata-03 subdata-04

文件重组–cat

一直以为cat就是用来显示文件的。。其实cat本来的用途就是文件的组合。

对于用split命令生成的以subdata-为固定前缀的文件:

1
subdata-00  subdata-01  subdata-02  subdata-03  subdata-04

我们可以非常方便的用cat命令进行组合,而不影响文件顺序:

1
$ cat subdata-* >data

Node第二部分-模块及工具

Posted on 2016-12-12 | In Node

为了让 NodeJs 的文件可以相互调用,NodeJs 提供了一个简单的模块系统。
模块是 NodeJs 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 NodeJs 文件就是一个模块,这个文件可能是 JavaScript 代码、JSON 或者编译过的 C/C++ 扩展。

Read more »

Node第一部分-初体验

Posted on 2016-12-10 | In Node

NodeJs是什么?

简单的说 NodeJs 就是运行在服务端的 JavaScript 。NodeJs 是一个基于 Chrome JavaScript 运行时建立的一个平台。NodeJs 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

  • 官网 https://nodejs.org
Read more »

用 Flow.CI 让 Hexo 持续集成

Posted on 2016-12-01 | In 博客栈

Flow.CI 是一个由著名移动应用公测平台 Fir.im 推出的持续集成(CI)的 saas 服务平台,感觉就是中国的 Travis.CI,作用是把你 Github 或者 Coding 上的代码拉过来,通过容器技术自动化完成代码的构建、测试、交付和部署。整个对 Flow.CI 使用下来的感受就是简洁和美观,配置方便,速度很快。

Read more »

使用 DaoCloud 让 Hexo 持续集成

Posted on 2016-11-29 | In 博客栈

用 Hexo 搭建好博客,使用起来算方便,而且静态页面使用起来很方便,但是每次还要在安装了 Hexo 环境的机器上才能写文章和发布。能不能在任何地方只要新增或修改了 post 就自动生成并部署 hexo 呢?

Read more »

工具使用篇之Markdown

Posted on 2016-11-27 | In Markdown

Markdown 介绍

  • Markdown 是一个 轻量级 高效率 的标记语言
  • 轻量级标记语言,2004 年被 John Gruber 创造, 它允许人们“使用易读易写的纯文本格式编写文档”, Markdown 最重要的设计就是可读性, Markdown 可以选择性的转换为 HTML 文档格式, 很多网站目前都使用了 Markdown 或者其变种,例如 Github 、简书等大型社区。
Read more »

JQuery分析及实现part7之 Ajax 模块功能及实现

Posted on 2016-11-25 | In javascript

JQuery模块分析及其实现第七部分 Ajax 部分功能及实现,接第六部分!

Read more »

JQuery分析及实现part6之动画模块功能及实现

Posted on 2016-11-24 | In javascript

JQuery模块分析及其实现第六部分动画部分功能及实现,接第五部分!

Read more »
1…343536…58

574 posts
69 categories
286 tags
© 2024 Companyd
Powered by Hexo
|
Theme — NexT.Muse v5.1.4