因为工作需要,从Python 2.5开始学习Python,当然只是简单的使用Python完成一些工作,没有很少深入学习。
一次,在一个多CPU的环境中,想用Python的多线程编程来达到使用完系统的CPU的目的,结果是不行的。最后发现,
Python 2.6以后提供了一个multiprocessing的库,可以达到这个目的。
分享如下:
##多线程编程
[root@AS-1 bin]# cat z.py # -*- coding:utf-8 -*-
import osimport threading def test(): while True: 65535+65535 if __name__ == "__main__": for n in range(20): print 'Proc(%d) Start...'%n p = threading.Thread(target=test, args=()) p.start()
##运行情况。见红色字体,只占用了一个CPU,系统CPU Idle 99.5%
[root@AS-1 bin]# ./python z.py &Proc(0) Start...Proc(1) Start...Proc(2) Start...Proc(3) Start...Proc(4) Start...Proc(5) Start...Proc(6) Start...Proc(7) Start...Proc(8) Start...Proc(9) Start...Proc(10) Start...Proc(11) Start...Proc(12) Start...Proc(13) Start...Proc(14) Start...Proc(15) Start...Proc(16) Start...Proc(17) Start...Proc(18) Start...Proc(19) Start...
[root@AS-1 bin]# top -n 1top - 03:06:56 up 30 days, 31 min, 3 users, load average: 1.25, 1.05, 0.65Tasks: 320 total, 1 running, 300 sleeping, 19 stopped, 0 zombieCpu(s): 0.3%us, 0.1%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%stMem: 32953084k total, 7391604k used, 25561480k free, 276480k buffersSwap: 34996216k total, 347648k used, 34648568k free, 3761504k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 25736 root 16 0 273m 4380 1664 S 127.6 0.0 0:34.65 python 25783 root 15 0 12864 1164 728 R 2.0 0.0 0:00.01 top 1 root 15 0 10344 564 528 S 0.0 0.0 0:02.16 init
## 多CPU编程, 见红色字体,用到了多个CPU(核/线程),系统CPU Idle为0.0%
[root@AS-1 bin]# cat x.py # -*- coding:utf-8 -*-
import osfrom multiprocessing import *
def test(): while True: 65535+65535
if __name__ == "__main__": for n in range(20): print "Proc(%d) Start..."%n p = Process(target = test, args = []) p.start()
[root@AS-1 bin]# ./python x.py Proc(0) Start...Proc(1) Start...Proc(2) Start...Proc(3) Start...Proc(4) Start...Proc(5) Start...Proc(6) Start...Proc(7) Start...Proc(8) Start...Proc(9) Start...Proc(10) Start...Proc(11) Start...Proc(12) Start...Proc(13) Start...Proc(14) Start...Proc(15) Start...Proc(16) Start...Proc(17) Start...Proc(18) Start...Proc(19) Start...
[root@AS-1 bin]# toptop - 03:09:44 up 30 days, 33 min, 3 users, load average: 6.20, 2.14, 1.07Tasks: 341 total, 22 running, 299 sleeping, 20 stopped, 0 zombieCpu(s):100.0%us, 0.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%stMem: 32953084k total, 7407396k used, 25545688k free, 276568k buffersSwap: 34996216k total, 347648k used, 34648568k free, 3762068k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND25940 root 25 0 83464 3364 468 R 100.0 0.0 0:21.25 python 25944 root 25 0 83464 3364 468 R 100.0 0.0 0:21.24 python 25945 root 25 0 83464 3364 468 R 100.0 0.0 0:21.18 python 25946 root 25 0 83464 3364 468 R 100.0 0.0 0:21.24 python 25948 root 25 0 83464 3368 468 R 100.0 0.0 0:21.15 python 25949 root 25 0 83464 3368 468 R 100.0 0.0 0:21.23 python 25951 root 25 0 83464 3372 468 R 100.0 0.0 0:21.21 python 25952 root 25 0 83464 3372 468 R 100.0 0.0 0:21.23 python 25953 root 25 0 83464 3380 468 R 100.0 0.0 0:21.22 python 25954 root 25 0 83464 3380 468 R 100.0 0.0 0:21.20 python 25943 root 25 0 83464 3364 468 R 99.6 0.0 0:21.21 python 25950 root 25 0 83464 3368 468 R 99.6 0.0 0:21.15 python 25959 root 25 0 83464 3388 468 R 50.5 0.0 0:10.53 python 25947 root 25 0 83464 3364 468 R 50.2 0.0 0:10.63 python 25957 root 25 0 83464 3384 468 R 50.2 0.0 0:10.53 python 25958 root 25 0 83464 3388 468 R 50.2 0.0 0:10.56 python 25941 root 25 0 83464 3364 468 R 49.8 0.0 0:10.72 python 25942 root 25 0 83464 3364 468 R 49.8 0.0 0:10.70 python 25955 root 25 0 83464 3384 468 R 49.8 0.0 0:10.62 python 25956 root 25 0 83464 3384 468 R 49.8 0.0 0:10.61 python 25976 root 15 0 12868 1276 816 R 0.3 0.0 0:00.03 top 1 root 15 0 10344 564 528 S 0.0 0.0 0:02.16 init