您的位置:首页 > 编程语言 > Python开发

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 编程