python多进程编程
2017-01-02 14:28
363 查看
背景:
采用多进程方式处理多任务方式1:基于multiprocessing
代码:
# -*- coding: utf-8 -*- __author__ = 'jason' #加入并行元素,提升处理速度,注意window和linux的多进程是不同的使用方法和不同的库,本文的代码是基于window系统 import urllib2 import os import Queue from multiprocessing import Process from multiprocessing import Pool,Queue import multiprocessing filename = "idlist.txt" file = open(filename, 'r') filenameresult = "result.txt" fileresult = open(filenameresult, 'w') def ProcessTxt(id): #根据入参任务id进行一序列的处理操作 return # 子进程要执行的代码 def long_time_task(myqueue,lock): print 'Run task (%s)...' % (os.getpid()) while True: id= myqueue.get() if id== -1: break else: ProcessTxt(str(id)) print str(os.getpid()),'\t',id done = 0 manager = multiprocessing.Manager() myqueue = manager.Queue()#注意,这里的queue如果直接用常用的,而非multiprocessing模块下的呢?可以尝试下会如何呢? worknum = 10#设置work数量 while not done: line = file.readline() if(line != ''): id = line.strip() myqueue.put(int(id))#tab和空格区别要注意,IDE下面编辑运行和解释器下的运行可能由此产生对齐上面的报错。。。 else: for i in range(worknum): myqueue.put(-1) done = 1 print 'queue size=',myqueue.qsize() # 父进程创建Queue,并传给各个子进程: print 'Parent process %s.' % os.getpid() lock = multiprocessing.Lock() for i in range(worknum): process = multiprocessing.Process(target=long_time_task, args=(myqueue,lock))#非阻塞 process.daemon = True#守护进程就是不阻挡主程序退出,该设置是必要的,欢迎尝试取消,之前并行运行失败,乃是由于此设置的疏忽造成。 process.start() process.join() print 'Waiting for all subprocesses done...' print 'All subprocesses done.'
备注:q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作
方式2:基于pool进程池
代码
# -*- coding: utf-8 -*- __author__ = 'jason' #加入并行元素,提升处理速度,注意window和linux的多进程是不同的使用方法和不同的库,本文的代码是基于window系统 import urllib2 import json import os import re import krc import base64 import Queue from multiprocessing import Process from multiprocessing import Pool,Queue import multiprocessing filename = "idlist.txt" file = open(filename, 'r') def ProcessTxt(id): #自定义的每个任务id的处理逻辑 return # 子进程要执行的代码 def long_time_task(i,myqueue): print 'Run task (%s)...' % (os.getpid()) # start = time.time() while True: if myqueue.empty(): return id = myqueue.get(True) ProcessTxt(str(id)) print str(os.getpid()),'\t',id done = 0 manager = multiprocessing.Manager() myqueue = manager.Queue() worknum = 10 while not done: line = file.readline() if(line != ''): id = line.strip() myqueue.put(int(id))#tab和空格区别。。。 else: done = 1 print 'queue size=',myqueue.qsize() if __name__ == "__main__": print 'Parent process %s.' % os.getpid() p = Pool() for i in range(4): p.apply_async(long_time_task, args=(i,myqueue)) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses done.'
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- 肯特·贝克:改变人生的代码整理魔法