您的位置:首页 > 其它

多进程

2016-01-15 12:07 309 查看
#单进程

#!/usr/bin/python
# -*- coding: utf-8 -*-
from multiprocessing import Process,Pool
import time,os
def fs(name,seconds):
print '%s will sleep: %d s,Now is %s ,fs pid is: %s' % (name,seconds,time.ctime(),os.getpid())
time.sleep(seconds)
print 'Now is: %s' % (time.ctime())
return 'fs' + name

if __name__ == '__main__':
print 'main Pname is %s' % (os.getpid())
for i in range(1,11):
p=Process(target=fs,args=(str(i),2))
p.start()
p.join()
print 'main end: ' + str(os.getpid())


#定义最大进程数量,Pool默认大小为CPU核心数量

#!/usr/bin/python
# -*- coding: utf-8 -*-
from multiprocessing import Process,Pool
import time,os
def fs(name,seconds):
print '%s will sleep: %d s,Now is %s ,fs pid is: %s' % (name,seconds,time.ctime(),os.getpid())
time.sleep(seconds)
print 'Now is: %s' % (time.ctime())
return 'fs' + name

if __name__ == '__main__':
print 'main Pname is %s' % (os.getpid())
p=Pool(processes=3)  #定义最多开启3个进程
for i in range(1,11):
p.apply_async(fs,args=(str(i),2))   #如果fs只接受一个参数,则写法为 p.apply_async(fs,args=(a1,))
p.close()
p.join()
print 'main end: ' + str(os.getpid())


#获取每个进程的执行结果

from multiprocessing import Process,Pool
import time,os
def fs(name,seconds):
print '%s will sleep: %d s,Now is %s ,fs pid is: %s' % (name,seconds,time.ctime(),os.getpid())
time.sleep(seconds)
print 'Now is: %s' % (time.ctime())
return 'fs' + name

if __name__ == '__main__':
print 'main Pname is %s' % (os.getpid())
p=Pool(processes=3)
#result只能获取函数fs的return语句的结果,与fs中的print无关
result=[]
for i in range(1,11):
print 'i is: %d' % (i)
result.append(p.apply_async(fs,args=(str(i),2)))
p.close()
p.join()
for r in result:
print r.get()
print 'main end: ' + str(os.getpid())


Win32平台添加如下代码,防止多进程崩溃

from multiprocessing import Process, freeze_support

if __name__ == '__main__':
freeze_support()


p.start()来启动子进程

p.join()方法来使得子进程运行结束后再执行父进程

示例:

ping多个域名:

def fping(ip):
import subprocess,sys
reload(sys)
sys.setdefaultencoding('utf-8')
sc = subprocess.Popen(['ping.exe',ip,'-n','2'],shell=True,stdout=subprocess.PIPE)
while sc.poll() == None:
sclines = sc.stdout.readlines()
for l in sclines:
#return l.strip().decode('GBK')
print l.strip().decode('GBK')

if __name__ == '__main__':
from multiprocessing import Process,Pool,freeze_support,Queue
freeze_support()
ips=['www.baidu.com','www.163.com','www.sina.com.cn','www.cctv.com','www.xin.com','apollo.youxinpai.com']
p=Pool(processes=4)
for ip in ips:
p.apply_async(fping,args=(ip,))
p.close()
p.join()


函数fping通过使用return取得返回结果:

def fping(ip):
import subprocess,sys
reload(sys)
sys.setdefaultencoding('utf-8')
sc = subprocess.Popen(['ping.exe',ip,'-n','1'],shell=True,stdout=subprocess.PIPE)
while sc.poll() == None:
sclines = sc.stdout.readlines()
prs =''
for l in sclines:
#return l.strip().decode('GBK')
prd = l.strip().decode('GBK') +'\n'
prs += prd
return prs.strip()

print fping('www.baidu.com')


同时ping多个域名,先将结果放到Queue中,然后再写入到文本文件(在通过Queue获取结果的时候,就已经变成了单进程阻塞,所以应该让每个进程将结果直接写入到内存或文本文件,最后再将每个结果合并到一起。Queue用来在进程间传递数据

from multiprocessing import Process,Pool,freeze_support
import subprocess,Queue,sys
reload(sys)
sys.setdefaultencoding('utf-8')

#定义函数fping,其返回结果先不进行编码,否则在写入Queue的时候会提示不能正确编码
def fping(ip):
sc = subprocess.Popen(['ping.exe',ip,'-n','1'],shell=True,stdout=subprocess.PIPE)
while sc.poll() == None:
sclines = sc.stdout.readlines()
return sclines

#定义多进程,先将每个进程的执行结果放入到Queue中,然后再将Queue中的结果取出来写入到文本文件中。因为无法多进程同时写一个文件
if __name__ == '__main__':
freeze_support()
ips=['www.baidu.com','www.163.com','www.sina.com.cn','www.cctv.com','www.xin.com','apollo.youxinpai.com']
q=Queue.Queue(len(ips))
p=Pool(processes=4)  #定义进程数量
for ip in ips:
pr = p.apply_async(fping,args=(ip,))  #这是传单个参数的写法
try:
q.put_nowait(pr.get())  #pr.get()取出单个进程的执行结果
except:
pass

p.close()
p.join()

#将ping的最终结果写入到文本文件
fpingfile = 'e:\\ping.txt'
fw = open(fpingfile,'a')

#从Queue中取出ping结果,写入到文本文件,再取出结果后,先进行重新编码,以便正确显示中文字符
while not q.empty():
rr = q.get_nowait()
prs =''
for l in rr:
prd = l.strip().decode('GBK') +'\n'
prs += prd
#print prs.strip() +'\n'
fw.write(prs.strip() +'\n')
fw.close()


以上代码可更改为如下,实现真正的多进程并发:

# -*- coding: UTF-8 -*-
from multiprocessing import Process,Pool,freeze_support,Manager
import subprocess,sys,time
reload(sys)
sys.setdefaultencoding('utf-8')

def fping(ip,ls):
sc = subprocess.Popen(['ping.exe',ip,'-n','1'],shell=True,stdout=subprocess.PIPE)
while sc.poll() == None:
sclines = sc.stdout.readlines()
ls.append(sclines)

if __name__ == '__main__':
freeze_support()
#使用Manager()在多进程间共享变量ls
manager = Manager()
ls = []
ls = manager.list()

ips=['www.baidu.com','www.163.com','www.sina.com.cn','www.cctv.com','www.xin.com','apollo.youxinpai.com']

p=Pool(processes=4)  #定义进程数量
for ip in ips:
p.apply_async(fping,args=(ip,ls))

p.close()
p.join()

#将结果写入到文本文件中
fpingfile = 'e:\\ping.txt'
fw = open(fpingfile,'a')
for lrs in ls:
for lr in lrs:
fw.write(lr.strip().decode('GBK') + '\n')
fw.close()


多进程间共享变量:
http://www.tuicool.com/articles/ZZri22 http://www.cnblogs.com/itech/archive/2012/01/10/2318120.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: