大家都知道Python的線程實際上是使用單核在運行,所以大多數想使用多核來運算,Python自己也提供了很多分布式架構,比如pp,pprocess等等,其中有網路分布式,也有單機分布式,詳情可參見:http://wiki.python.org/moin/ParallelProcessing
其中本人也研究過幾個分布式架構,感覺還是非常強大的,但多多少少存在不足(主要取決於需求)和一定複雜度(架構學習),工作中涉及到一個很簡單的使用多核計算模型,自己寫了一個使用多核的外殼和大家分享一下:
#!/usr/bin/env python
# encoding: utf-8
"""
ppworker.py
啟動多個worker服務進程
option:
-n: start worker num
-h: print help info
Created by zhoubo on 2011-09-26.
"""
import time
import traceback
import subprocess
import getopt
import sys
import os
abspath = os.path.dirname(os.path.abspath(__file__))
ncpus = 4 #使用CPU數
def main():
"""main docstring"""
try:
opts, args = getopt.getopt(sys.argv[1:],'hn:')
except getopt.GetoptError, e:
print e
print __doc__
return
for k, v in opts:
if k == '-n':
ncpus = int(v)
else:
print __doc__
return
ncpus = ncpus > 0 and ncpus or 1
jobs = []
cmd = ('python', os.path.join(abspath, 'worker.py'))
while True:
if len(jobs) < ncpus:
sp = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
jobs.append(sp)
for sp in jobs:
if sp.poll() is not None:
jobs.remove(sp)
if len(jobs) == ncpus:
time.sleep(60)
if __name__ == '__main__':
main()
其中worker.py指令碼則是真正的單進程執行指令碼,可根據具體需求編寫。