进程

python中创建进程模块为:multiprocessing

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

进程之间数据不是共享的

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

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

import multiprocessing

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

进程常用方法:

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

示例代码:

import time
import multiprocessing def task(arg):
p = multiprocessing.current_process() # 获取当前进程
print(p.name) # 打印当前进程名称
print(p.ident) # 获取当前进程的ID号
print(p.pid) # 获取当前进程的ID号
time.sleep(2)
print(arg) def run():
print('11111111')
#### 进程一
process1 = multiprocessing.Process(target=task,args=(1,))
# False 主进程执行完毕后,会等待子进程执行完毕
# True 为不等待子进程执行完毕,主进程执行完毕后,程序就会结束
process1.daemon = False
# 为当前进程起一个名称
process1.name = 'proc1'
process1.start()
# 默认会等进程执行完毕后,代码才会继续往下执行
process1.join() print('22222222') #### 进程二
process2 = multiprocessing.Process(target=task, args=(2,))
process2.daemon = False
process2.name = 'proc2'
process2.start()
process2.join() print('33333333') if __name__ == '__main__':
run()

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

##################### 类继承方式创建进程  #####################
import multiprocessing class MyProcess(multiprocessing.Process):
def run(self):
print('当前进程', multiprocessing.current_process()) def run():
t1 = MyProcess()
t1.start() t2 = MyProcess()
t2.start() if __name__ == '__main__':
run()

进程之间的数据共享

multiprocessing.Queue(列表数据共享)

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

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

multiprocessing.Manger(字典数据共享)

linux mac下可以正常执行

示例代码:

import multiprocessing

m = multiprocessing.Manager()
dic = m.dict() def task(arg):
dic[arg] = 100 def run():
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start() input('>>>')
print(dic.values()) if __name__ == '__main__':
run()

windowns:

  • 第一种方法
import multiprocessing

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

进程锁

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

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

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

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

锁的方法

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

示例代码

import time
import multiprocessing lock = multiprocessing.Lock()
lock = multiprocessing.RLock()
lock = multiprocessing.BoundedSemaphore()
lock = multiprocessing.Condition()
lock = multiprocessing.Event() def task(arg):
print('开始了')
lock.acquire()
time.sleep(2)
print(arg)
lock.release() def run():
for num in range(1,3):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start() if __name__ == '__main__':
run()

进程池

使用的模块 concurrent.futures

和线程池是一样的

示例代码:

import time
# 导入进程池模块
from concurrent.futures import ProcessPoolExecutor def task(arg):
time.sleep(2)
print(arg) if __name__ == '__main__':
# 创建一个进程池
pool = ProcessPoolExecutor(5)
for num in range(10):
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. upc组队赛15 Lattice's basics in digital electronics【模拟】

    Lattice's basics in digital electronics 题目链接 题目描述 LATTICE is learning Digital Electronic Technology. ...

  2. 【Python—待解惑的问题】

    疑问1: map()函数第一个参数接收函数,所以 dict.keys() 是函数?这个不是方法吗? map(dict.keys,s) s1.keys() == dict.keys(s1) 输入: Tr ...

  3. FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u012951123/article/details/36871955 <span style= ...

  4. console.log的另一种用法

    // console.log用法 var foo, bar; console.log(`foo's type: ${foo}`, `bar's type: ${bar}`); 输出:

  5. webpack + vue 打包生成公共配置文件(域名) 方便动态修改

    需求原因 原来的项目中域名是打包到项目里面的,打包后不能动态配置,只能通过不同的指令打包来切换域名,每天都在测试域名和正式域名来回摩擦,后台大佬说你们可以生成一个配置文件这样就不用频繁打包了直接修改配 ...

  6. elasticsearch 英文数字组合字符串模糊检索

    不分词,然后用wildcard查询 { "query": { "wildcard": { "字段名": "*123*" ...

  7. REST接口设计

    REST接口设计 为什么要有REST 在传统上,软件和网络是两个不同的领域,很少有交集:软件开发主要针对单机环境,网络则主要研究系统之间的通信.互联网的兴起,使得这两个领域开始融合,现在我们必须考虑, ...

  8. wpf 查找控件

    public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : Framewo ...

  9. 最长上升子序列(LIS)长度及其数量

    例题51Nod-1376,一个经典问题,给出一个序列问该序列的LIS以及LIS的数量. 这里我学习了两种解法,思路和代码都是参考这两位大佬的: https://www.cnblogs.com/reve ...

  10. SP2-0618: Cannot find the Session Identifier.

    [oracle@trade1 ~]$ sqlplus  user1/user1 SQL*Plus: Release 11.2.0.3.0 Production on Tue Aug 6 14:31:1 ...