转载:https://www.cnblogs.com/xiaobeibei26/p/6484849.html

Python多进程之multiprocessing模块和进程池的实现

1、利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
'''
代码是由主进程里面的主线程从上到下执行的,
我们在主线程里面又创建了两个子进程,子进
程里面也是子线程在干活,这个子进程在主进
程里面
'''
import multiprocessing
import time
 
def f0(a1):
    time.sleep(3)
    print(a1)
if __name__ == '__main__':#windows下必须加这句
 
    = multiprocessing.Process(target=f0,args=(12,))
    t.daemon=True#将daemon设置为True,则主线程不比等待子进程,主线程结束则所有结束
    t.start()
 
    t2 = multiprocessing.Process(target=f0, args=(13,))
    t2.daemon = True
    t2.start()
 
    print('end')#默认情况下等待所有子进程结束,主进程才结束

  这里的结果是直接打印出end就结束了,因为添加了t.daemon=True,join方法在进程里面也可以用,跟线程的用法非常相似

2、进程之间默认是不能共用内存的

1
2
3
4
5
6
7
8
9
10
11
12
13
li = []
 
def f1(i):
    li.append(i)
    print('你好',li)
 
if __name__ =='__main__':#进程不能共用内存
    for in range(10):
        = Process(target=f1,args=(i,))
        p.start()
 
'''每个进程都创建一个列表,然后添加一个因素进去,
   每个进程之间的数据是不能共享的

  结果如图

如果将代码改成threading,由于线程共用内存,所以结果是不一样的,线程操作列表li之前,拿到的是前一个线程操作过的li列表,如图

3、如果要进程之间处理同一个数据,可以运用数组以及进程里面的manager方法,下面代码介绍的是manager方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from multiprocessing import Process
from multiprocessing import Manager
 
 
 
def f1(i,dic):
    dic[i] = 200+i
    print(dic.values())
 
if __name__ =='__main__':#进程间默认不能共用内存
    manager = Manager()
    dic = manager.dict()#这是一个特殊的字典
 
 
    for in range(10):
        = Process(target=f1,args=(i,dic))
        p.start()
        p.join()

  这里输出如图,表示每个进程都是操作这个字典,最后的输出是有10个元素

如果是普通的字典,输出如图

4、multiprocessing模块里面的进程池Pool的使用

(1)apply模块的使用,每个任务是排队执行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from multiprocessing import Process,Pool
from multiprocessing import Manager
import time
 
 
def f1(a):
    time.sleep(2)
    print(a)
 
if __name__ =='__main__':
    pool =Pool(5)
    for in range(5):#每次使用的时候会去进程池里面申请一个进程
        pool.apply(func=f1,args=(i,))
        print('你好')#apply里面是每个进程执行完毕了才执行下一个进程
    pool.close()#执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    pool.join()#等待进程运行完毕,先调用close函数,否则会出错

  运行结果如图

(2)apply_async模块,会比apply模块多个回调函数,同时是异步的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from multiprocessing import Process,Pool
from multiprocessing import Manager
import time
 
 
 
def Foo(i):
    time.sleep(1)
    return i+50
 
def Bar(arg):
    print(arg)
 
if __name__ =='__main__':
    pool = Pool(5)
    for in range(10):
 
        '''apply是去简单的去执行,而apply_async是执行完毕之后可以执行一
        个回调函数,起提示作用'''
        pool.apply_async(func=Foo,args=(i,),callback=Bar)#是异步的
        print('你好')
    pool.close()#不执行close会报错,因为join的源码里面有个断言会检验是否执行了该方法
    pool.join()#等待所有子进程运行完毕,否则的话由于apply_async里面daemon是设置为True的,主进程不会等子进程,所欲函数可能会来不及执行完毕就结束了
'''apply_async里面,等函数Foo执行完毕,它的返回结果会被当做参数
    传给Bar'''

  结果如图

这两个方法的主要区别如图

多进程之multiprocessing模块和进程池的实现的更多相关文章

  1. Python多进程之multiprocessing模块和进程池的实现

    1.利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似 ''' 代码是由主进程里面的主线程从上到下执行 ...

  2. 多进程之multiprocessing模块、守护进程、互斥锁

    目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...

  3. 进程之multiprocessing模块代码篇

    这里再把之前的内容总结和补充一下: 并发和并行: 你在干坏事,来了一个电话,干完坏事再去接电话,说明你既不是并发也不是并行. 你在干坏事,来了一个电话,你接完电话接着干坏事,说明你支持并发 你在干坏事 ...

  4. Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

    队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...

  5. 进程之multiprocessing

    进程的状态:

  6. python-day37--concurrent.futures模块 实现进程池与线程池

    1.concurrent.futures模块 直接内置就是 异步的提交   ,如果你想同步也可以实现(p.submit(task,i).result()即同步执行) 2.属性和方法: 1.submit ...

  7. python学习笔记——multiprocessing 多进程组件 进程池Pool

    1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...

  8. 使用multiprocessing模块操作进程

    1.Process模块介绍 process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. Process([group [, target [, name [, args [, kwa ...

  9. 使用multiprocessing模块创建进程

    #_author:来童星#date:2019/12/17from multiprocessing import Processimport timeimport os#两个子进程将会调用的两个方法de ...

随机推荐

  1. Qt编写自定义控件28-颜色滑块面板

    一.前言 相比于上一个颜色按钮面板,此控件就要难很多,颜色值有三种表示形式,除了程序员最常用的RGB以外,还有HSB和CMY方式. RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝 ...

  2. springboot动态定时任务

    SpringBoot设置动态定时任务 一.说明 1.在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置. 2.定时任务执行时间可根据数据库中某个设置字段动 ...

  3. ps填充颜色快捷键

    一:选中区域: 二:填充前景色快捷键是“Alt+Delete”: 三:填充背景色的键盘快捷键是“Ctrl+Delete”:

  4. Vue的基础学习

    一.Vue的计算属性:get和set属性 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  5. Flutter酷炫的路由动画效果

    现在Flutter的路由效果已经非常不错了,能满足大部分App的需求,但是谁不希望自己的App更酷更炫那,下面介绍几个酷炫的路由动画. 其实路由动画的原理很简单,就是重写并继承PageRouterBu ...

  6. opc 带有session

    现在使用java来做工控系统的几种方式: 知识储备: 一.OPC Server端目前常见的有以下几种协议: 参考博客:https://www.cnblogs.com/ioufev/articles/9 ...

  7. 部署zabbix监控平台(源码安装)

    案例:部署Zabbix监控平台 1 问题 本案例要求部署一台Zabbix监控服务器,一台被监控主机,为进一步执行具体的监控任务做准备: 安装LNMP环境 源码安装Zabbix 安装监控端主机,修改基本 ...

  8. Python_小林的爬取QQ空间相册图片链接程序

    前言 昨天看见某人的空间有上传了XXXX个头像,然后我就想着下载回来[所以本质上这是一个头像下载程序],但是一个个另存为太浪费时间了,上网搜索有没有现成的工具,居然要注册码,还卖45一套.你们的良心也 ...

  9. 能力不足的C++开发会欺辱能力不足C#开发

    能力不足的C++开发会欺辱能力不足C#开发 我被C++开发欺辱的岁月   前言 人被压迫了,为什么不斗争?——鲁迅 作为一个C#开发者,我经历了,也见证了很多同行饱受C++开发的歧视和欺辱. 而且,这 ...

  10. 《The C Programming Language》学习笔记

    第五章:指针和数组 单目运算符的优先级均为2,且结合方向为自右向左. *ip++; // 将指针ip的值加1,然后获取指针ip所指向的数据的值 (*ip)++; // 将指针ip所指向的数据的值加1 ...