多进程
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
相关文章推荐
- 1.15 构造数独
- iOS应用程序的生命周期
- PostgreSQL Monitor pg_view
- nginx+gunicorn+virtualenv部署django项目
- 验证码倒计时
- 转: Hibernate commit() 和flush() 的区别
- hdu1978
- 详解Linux系统中crontab命令处理定时任务的用法
- Codeforces Round #339 (Div. 2)-B. Gena's Code(字符串模拟)
- Ado.Net小练习03(省市联动)
- Ado.Net小练习03(省市联动)
- 网址备录
- scrapy实战一
- 头像剪裁
- swift-1
- android 启动adb
- thinkphp验证码
- MySQL Cluster 优点和缺点
- django 复合主键(composit primary key)
- boost::bind的使用方法