python多进程编程

背景:

采用多进程方式处理多任务

方式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.'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值