背景:
采用多进程方式处理多任务
方式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.'