python多进程间通信-使用队列

背景

随着业务需求的提升,程序需要多进程进行,多进程里面不得不提到的就是多进程通信,因为不仅仅是两个进程(两个进程使用Pipe即可),所以使用到的是队列方式来解决。

先直接上代码。

代码

# -*- coding=utf-8 -*-
import time
import sys,os
import random
import multiprocessing
from multiprocessing import Pool,Manager

class Spider(multiprocessing.Process):
    def __init__(self, queue):
        self.queue = queue
        multiprocessing.Process.__init__(self)
        self.process_num = os.getpid()

    def run(self):
        while self.queue.empty() is False:
            print('cur pid:', self.process_num, ' queue_url:', self.queue.get()['url'])
            # 模拟每条记录处理的时长
            rand_sleep = random.randint(1,6)
            time.sleep(rand_sleep)

        print('cur pid:', self.process_num, ' queue: is empty')

def start_spider(queue):
    p1 = Spider(queue)
    p1.run()

def error_test(name):
    print("[子进程%s]PID=%d, PPID=%d" % (name, os.getpid(), os.getppid()))
    raise Exception("[子进程%s]我挂了" % name)

process_num = 4  # 模拟需要使用的进程数
record_len = 10  # 模拟需要处理的记录条数
if __name__ == '__main__':
    q = Manager().Queue(record_len)
    # 将待处理数据依次存入队列中
    for i in range(record_len):
        q.put({'id': i, 'url': 'http://www.lbelieve.cn/id/' + str(i)})

    if q.qsize():
        p = Pool(process_num)
        for i in range(process_num):
            p.apply_async(
                start_spider,
                args=(q, ),
                callback=None,
                error_callback=None)
        p.close()
        p.join()
        print("over")

运行结果

好记性不如烂笔头

以上代码实现了多进程用竞争的方式依次来处理队列内的记录。

模拟了4个进程,10条记录。各个进程依次执行。

需要注意到的是,我在多进程实例化时用到的是

multiprocessing.Pool

所以在使用队列时,必须也要用到multiprocessing.Manager

中的队列

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值