python 归纳 (十五)_多进程使用Pool

1 usePool.py

#coding: utf-8
"""
学习进程池使用 multiprocessing.Pool
总结:
  1. Pool 池用于处理 多进程,并不是多线程
  2. 池有大小的概念
  3. 并不是所有的子进程添加完了,才开始启动子进程。 当第一个进程添加到池中的时候,马上就启动了

使用:
  1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
  2. 往池中添加进程  主要:pool.apply_async(func, (参数, )) or pool.apply(func, (参数, ))
  3. 调用 pool.close(); pool.join() (一般伴随 apply_async),等待所有子进程结束

其他:
terminate()    结束工作进程,不再处理未完成的任务
map(...) 将一个集合数据 映射到 同一个函数,  根据集合大小 执行多次子进程
get()  从子进程获取返回结果
"""
import multiprocessing
import time

# 进程代码
def func(msg):
    print "sub begin:", msg
    time.sleep(2)
    print "sub end:",msg

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 3) # 创建进程池
    for i in xrange(5):
        msg = " %d" %(i)

        #  apply_async 非阻塞,一般和join一起使用, apply 阻塞 主进程等待子进程一个接一个执行完
        #  apply_async 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
        #  apply_async 这里创建的都是守护进程
        pool.apply_async(func, (msg, ))  # 实际开发中,每个子线程执行不同的逻辑
        time.sleep(1)
        print "alread start sub,%d\n" % i

    print "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~"
    pool.close() # 关闭pool使其不在接受新的任务,必须有
    pool.join()  # 等待所有子进程结束  调用join之前,先调用close函数,
    print "Sub-process(es) done."

"""
pool.apply_async
Out:

sub begin:  0
alread start sub,0

sub begin:  1
alread start sub,1

sub begin:  2
sub end:  0
sub end:  1alread start sub,2

sub begin:  3
alread start sub,3

sub begin:  4
sub end:  2
sub end:alread start sub,4
 3

Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
sub end:  4
Sub-process(es) done.

"""

"""
pool.apply
Out:

sub begin:  0
sub end:  0
alread start sub,0

sub begin:  1
sub end:  1
alread start sub,1

sub begin:  2
sub end:  2
alread start sub,2

sub begin:  3
sub end:  3
alread start sub,3

sub begin:  4
sub end:  4
alread start sub,4

Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.

"""

2 usePoolmap.py

# -*- coding: utf-8 -*-
"""
使用 multiprocessing.Pool.map 执行多进程

逻辑:
   有10个大小的列表,进程池4个大小
   使用map执行完

总结:
   可以简化启动子进程代码

使用:
    1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
    2. 准备list 数据  i_list = range(10)
    3. 准备子进程执行代码 函数 sub_process_code
    4. 调用 pool.map(sub_process_code, i_list)
       或
            pool.map_async(sub_process_code, i_list)
            pool.close()
            pool.join()

"""
import multiprocessing
import time
import os
def sub_process_code(x):
    # 打印  hh:ss 编号 进程ID
    print time.strftime(‘%M:%S‘,time.localtime(time.time())),x * x,os.getpid()
    time.sleep(3)

if __name__ == ‘__main__‘:
    pool = multiprocessing.Pool(multiprocessing.cpu_count()) # 根据CPU数量创建进程池,这里是4个
    i_list = range(10)
    pool.map(sub_process_code, i_list)

    ## 下面3行代码 = 上面一行代码
    # pool.map_async(sub_process_code, i_list) # 异步
    # pool.close()
    # pool.join()  # 如果没有join,主进程 结束后,所有子进程马上结束了
    print "end"

"""
Out:

24:20 0 5960
24:20 1 5840
24:20 4 5892
24:20 9 6944
24:23 16 5960
24:23 25 5840
24:23 36 5892
24:23 49 6944
24:26 64 5960
24:26 81 5840
end

"""

3 usePoolgetData.py

# -*- coding: utf-8 -*-
"""
使用进程池 multiprocessing.Pool,获取子进程的返回数据

使用:
    1. 创建进程池对象 pool = multiprocessing.Pool(processes = 3)
    2. 往池中添加进程,同时拿到Result对象 p_ApplyResult_obj = pool.apply_async(func, (参数, ))
    3. 调用 pool.close(); pool.join() 等待所有子进程结束
    4. 获取子进程的返回数据  p_ApplyResult_obj.get()
"""

import multiprocessing
import time

#  子进程代码,会return 数据给主进程
def func(msg):
    time.sleep(3)
    print "end"
    return "return " + msg

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)
    result = []   # 存储Result对象

    for i in xrange(3):
        msg = "hello %d" %(i)
        # 添加子进程的同时,获取它的返回对象
        p_ApplyResult_obj = pool.apply_async(func, (msg, ))
        print id(p_ApplyResult_obj)  # 打印pool对象 ID
        result.append(p_ApplyResult_obj)
    pool.close()
    pool.join()
    for res in result:
        print ":::", res.get()   # 获取子进程的return结果
    print "Sub-process(es) done."

"""
Out:

41974752
41974864
41975032
endend

end
::: return hello 0
::: return hello 1
::: return hello 2
Sub-process(es) done.
"""

参考:

python进程池:multiprocessing.pool

原文地址:https://www.cnblogs.com/sunzebo/p/9623646.html

时间: 2024-10-31 03:20:37

python 归纳 (十五)_多进程使用Pool的相关文章

Python爬虫(十五)_案例:使用bs4的爬虫

本章将从Python案例讲起:所使用bs4做一个简单的爬虫案例,更多内容请参考:Python学习指南 案例:使用BeautifulSoup的爬虫 我们已腾讯社招页面来做演示:http://hr.tencent.com/position.php?&start=10#a 使用BeautifulSoup4解析器,将招聘网页上的职位名称.职位类别.招聘人数.工作地点.时间.以及每个职位详情的点击链接存储出来. #-*- coding:utf-8 -*- from bs4 import Beautiful

python 归纳 (十二)_并发队列Queue的使用

# -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 3. 队列中可以存储不同的数据类型对象 4. 队列的实现大量用到 线程模块 threading ,说明适用多线程之间的数据共享操作 不确定是否适合多进程之间的数据共享操作 5. 队列的实现用到锁操作,acquire,release,wait,notify 不需要在个人代码中使用 使用: 1. 创建队列对象

python 归纳 (十四)_队列Queue实现生产者消费者

# -*- coding: UTF-8 -*- """ 多线程的生产者,消费者 使用队列Queue """ import Queue import threading import time import random queue = Queue.Queue(3) # 创建3个大小的队列 class Producer(threading.Thread): """ 生产者,往队列中写数据 ""&qu

python第十五天

python第十五天 今日内容 常用模块的介绍: time,datetime os,sys hashlib,json,pickle,collections time:和时间相关 封装了获取时间戳和字符串形式的时间的一些方法. time.time():获取时间戳 time.gmtime([seconds]):获取格式化时间对象:是九个字段组成的 time.localtime([seconds]):获取格式化时间对象:是九个字段组成的 time.mktime(t):时间对象 -> 时间戳 time.

Python学习笔记十五_开发接口

1.mock接口,模拟一些接口,在别的接口没有开发好的时候,你需要用它 假的支付接口,模拟支付成功 2. 3.查看数据,避免直接操作数据库flask web开发框架 实例化server 装饰器,下面的函数变为一个接口 启动服务 import flask,json #__name__代表当前这个python文件 server = flask.Flask(__name__)#实例化server,把当前这个python文件,当做一个服务 def my_db(sql): import pymysql c

Python第十二章-多进程和多线程01-多进程

多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次完成的话,估计就没有那么好的效果了(想一下场景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~) 程序中 如下程序,来模拟"唱歌跳舞"这件事情 # 模拟唱歌,跳舞 from time import sleep def sing(): for i in range(3): print("

python学习十五天

内置函数二 1.lamda匿名函数 2. sorted() 3. filter() 4. map() 5. 递归函数 一. lamda匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算n的n次方 def func(n): eturn n**n print(func(10)) f = lambda n: n**n print(f(10)) lambda表示的是匿匿名函数. 不需要用def来声明, 一句句话就可以声明出一个函数 语法: 函数名 = lambda 参数: 返回值 注意: 1.

selenium python (十五)控制滚动条操作

#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #一般用到操作滚动条的两个场景    #注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方    #要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条    #用于标识滚动条位置的代码        #<body >        #<body > from selenium import webdriverimport 

Python学习十五:sorted()

sorted()是Python内置的一个高阶函数,可以实现对list的排序,它还可以接收一个比较函数来实现自定义的排序. 现在有一个list : [36, 5, 12, 9, 21] 我们分别对这个list进行如下操作: 1.对list进行排序,使用sorted直接排序即可: print sorted([36, 5, 12, 9, 21]) 2.对list进行倒序排序,可以自定一个方法: def reversed_cmp(x, y): if x > y: return -1 if x < y: