进程

python中创建进程模块为:multiprocessing

开销非常大 是计算机中资源分配的最小单位(内存隔离) 能利用多个CPU 由操作系统控制 同时操作内存之外的数据会产生数据的不安全

进程之间数据不是共享的

注意:windowns下进程运行会报错,linux mac 不会出现此问题。解决方法:

将进程启动代码放到main里即可执行,示例代码:

  1. import multiprocessing
  2. def task(arg):
  3. print(arg)
  4. def run():
  5. for i in range(10):
  6. # 实例化一个进程
  7. process = multiprocessing.Process(target=task,args=(i,))
  8. # 进程启动
  9. process.start()
  10. if __name__ == '__main__':
  11. run() # main下才能正确执行,不然会报错

进程常用方法:

  • join():和线程一样,默认会等子进程执行完毕后,代码才会继续往下执行
  • daemon:
    • True 为 主进程执行完代码,程序会直接结束,不会等待子进程执行完毕
    • False为:主进程执行完毕后,会等待子进程执行完毕
  • name:为进程起一个名称
  • multiprocessing.current_process() :获取当前进程
  • ident/pid:获取当前进程的ID号

示例代码:

  1. import time
  2. import multiprocessing
  3. def task(arg):
  4. p = multiprocessing.current_process() # 获取当前进程
  5. print(p.name) # 打印当前进程名称
  6. print(p.ident) # 获取当前进程的ID号
  7. print(p.pid) # 获取当前进程的ID号
  8. time.sleep(2)
  9. print(arg)
  10. def run():
  11. print('11111111')
  12. #### 进程一
  13. process1 = multiprocessing.Process(target=task,args=(1,))
  14. # False 主进程执行完毕后,会等待子进程执行完毕
  15. # True 为不等待子进程执行完毕,主进程执行完毕后,程序就会结束
  16. process1.daemon = False
  17. # 为当前进程起一个名称
  18. process1.name = 'proc1'
  19. process1.start()
  20. # 默认会等进程执行完毕后,代码才会继续往下执行
  21. process1.join()
  22. print('22222222')
  23. #### 进程二
  24. process2 = multiprocessing.Process(target=task, args=(2,))
  25. process2.daemon = False
  26. process2.name = 'proc2'
  27. process2.start()
  28. process2.join()
  29. print('33333333')
  30. if __name__ == '__main__':
  31. run()

类继承方式创建进程(示例代码如下:)

  1. ##################### 类继承方式创建进程 #####################
  2. import multiprocessing
  3. class MyProcess(multiprocessing.Process):
  4. def run(self):
  5. print('当前进程', multiprocessing.current_process())
  6. def run():
  7. t1 = MyProcess()
  8. t1.start()
  9. t2 = MyProcess()
  10. t2.start()
  11. if __name__ == '__main__':
  12. run()

进程之间的数据共享

multiprocessing.Queue(列表数据共享)

windows下执行数据共享有点问题,所以使用下面方法可以解决

  • 示例代码:
  1. ##################### 进程之间的数据共享 multiprocessing.Queue #####################
  2. import multiprocessing
  3. q = multiprocessing.Queue() # 数据共享可以使用的队列
  4. def task(arg,q):
  5. q.put(arg)
  6. def run():
  7. for num in range(10):
  8. proc = multiprocessing.Process(target=task,args=(num,q))
  9. proc.start()
  10. while True:
  11. v = q.get()
  12. print(v)
  13. if __name__ == '__main__':
  14. run()

multiprocessing.Manger(字典数据共享)

linux mac下可以正常执行

示例代码:

  1. import multiprocessing
  2. m = multiprocessing.Manager()
  3. dic = m.dict()
  4. def task(arg):
  5. dic[arg] = 100
  6. def run():
  7. for num in range(10):
  8. proc = multiprocessing.Process(target=task,args=(num,))
  9. proc.start()
  10. input('>>>')
  11. print(dic.values())
  12. if __name__ == '__main__':
  13. run()

windowns:

  • 第一种方法
  1. import multiprocessing
  2. def task(arg,dic):
  3. dic[arg] = 100
  4. if __name__ == '__main__':
  5. m = multiprocessing.Manager()
  6. dic = m.dict()
  7. for num in range(10):
  8. proc = multiprocessing.Process(target=task,args=(num,dic))
  9. proc.start()
  10. proc.join() # 一个一个进程等待,执行完了,再执行下一个
  11. print(dic)
  • 第二种方法(linux也适用)
  1. import time
  2. import multiprocessing
  3. def task(arg,dic):
  4. time.sleep(2)
  5. dic[arg] = 100
  6. if __name__ == '__main__':
  7. m = multiprocessing.Manager()
  8. dic = m.dict()
  9. process_list = []
  10. for num in range(10):
  11. proc = multiprocessing.Process(target=task,args=(num,dic))
  12. proc.start()
  13. process_list.append(proc)
  14. while True:
  15. count = 0
  16. for p in process_list:
  17. if not p.is_alive():
  18. count += 1
  19. if count == len(process_list):
  20. break
  21. print(dic)

进程锁

概念:不管线程还是进程,锁都是一样的

什么时候用锁: 只有进程或线程操作同一个数据的时候才会进行加锁,如果各自做各自的是不需要加锁的

具体意义看多线程里的锁机制,和进程一样

多线程锁:https://www.cnblogs.com/Hybb/p/11512011.html

锁的方法

  • Lock(一次放行一个)
  • RLock 递归锁(一次放行多个)
  • BoundedSemaphore (一次放N个) 信号量
  • Condition (1次放x个数)动态输入
  • Event (事件)1次放所有

示例代码

  1. import time
  2. import multiprocessing
  3. lock = multiprocessing.Lock()
  4. lock = multiprocessing.RLock()
  5. lock = multiprocessing.BoundedSemaphore()
  6. lock = multiprocessing.Condition()
  7. lock = multiprocessing.Event()
  8. def task(arg):
  9. print('开始了')
  10. lock.acquire()
  11. time.sleep(2)
  12. print(arg)
  13. lock.release()
  14. def run():
  15. for num in range(1,3):
  16. proc = multiprocessing.Process(target=task,args=(num,))
  17. proc.start()
  18. if __name__ == '__main__':
  19. run()

进程池

使用的模块 concurrent.futures

和线程池是一样的

示例代码:

  1. import time
  2. # 导入进程池模块
  3. from concurrent.futures import ProcessPoolExecutor
  4. def task(arg):
  5. time.sleep(2)
  6. print(arg)
  7. if __name__ == '__main__':
  8. # 创建一个进程池
  9. pool = ProcessPoolExecutor(5)
  10. for num in range(10):
  11. pool.submit(task,num)

python-并发编程之进程的更多相关文章

  1. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  2. Python并发编程之进程池与线程池

    一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...

  3. Python并发编程之进程

    一.理论概念 1.定义 进程(Process 也可以称为重量级进程)是程序的一次执行.在每个进程中都有自己的地址空间.内存.数据栈以及记录运行的辅助数据,它是系统进行资源分配和调度的一个独立单位. 2 ...

  4. python并发编程之进程池,线程池,协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  5. python并发编程之进程池,线程池concurrent.futures

    进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...

  6. python并发编程之进程池、线程池、协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

  7. 15.python并发编程(线程--进程--协程)

    一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...

  8. python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞

    操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...

  9. Python并发编程(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  10. Python并发编程-多进程进程锁

    from multiprocessing import Process import json import time from multiprocessing import Lock def sho ...

随机推荐

  1. 洛谷P3366 【模板】最小生成树(LCT)

    [模板]最小生成树 题目传送门 解题思路 用LCT来维护最小生成树. 除了把各顶点作为节点外,每条边也都视为一个节点.对于要加入的边\(e\),检查其两顶点\(x\)和\(y\)是否在同一棵树中,如果 ...

  2. 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)

    使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...

  3. SQL数据库—<1>SQL语言

    关系数据库.SQL语言简单.学习软件介绍 SQL:Structured Query Language 结构化查询语言 数据库分为:层次型,网状型,关系型. 关系型数据库:是一个二维表的集合,可以用来存 ...

  4. mybatis的缓存机制及用例介绍

    在实际的项目开发中,通常对数据库的查询性能要求很高,而mybatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求. mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSessio ...

  5. Oracle之分页问题

    前面的Top-N问题使用了reownum,但是又遇到个分页问题,将表emp的4行为1页输出,前4行很好做: select rownum,empno,ename,sal from emp ; 但是4-- ...

  6. Robot Framework使用技巧之内部变量

    [转载] 1.变量的使用 变量可以在命令行中设置,个别变量设置使用--variable (-v)选项,变量文件的选择使用--variablefile (-V)选项. 通过命令行设置的变量是全局变量,对 ...

  7. python3.x __str__与__repr__

    __repr__和__str__用于显示,__str__是面向用户的,而__repr__面向coder[调试与开发] repr(默认交互式回显)[来自python入门] str(也就是打印语句) 一般 ...

  8. css强制换行和超出部分隐藏实现

    一.强制换行 1 word-break: break-all; 只对英文起作用,以字母作为换行依据. 2 word-wrap: break-word; 只对英文起作用,以单词作为换行依据. 3 whi ...

  9. jsp中$使用不了

    导入了jstl <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>为啥 ...

  10. boost smart pointer

    1. boost::scoped_ptr is a smart pointer that is the sole owner of a dynamically allocated object and ...