进程 (process)

进程是对各种资源管理的集合,包含对各种资源的调用、内存的管理、网络接口的调用

进程要操作 CPU 必须先启动一个线程,启动一个进程的时候会自动创建一个线程,进程里的第一个线程就是主线程

程序执行的实例

有唯一的进程标识符(pid)

multiprossing 模块

启动进程

示例:

import multiprocessing
import time def process_run(n):
time.sleep(1)
print('process', n) for i in range(10):
p = multiprocessing.Process(target=process_run, args=(i, ))
p.start()

所有进程都是由父进程启动的

示例:

import multiprocessing
import os def show_info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id', os.getpid())
print('\n\n') def f(name):
show_info('function f')
print(name) if __name__ == '__main__':
show_info('main process line')
p = multiprocessing.Process(target=f, args=('children process', ))
p.start()

进程间通信

线程间共享内存空间,进程间只能通过其他方法进行通信

Queue

注意这个 Queue 不同于 queue.Queue

Queue type using a pipe, buffer and thread

两个进程的 Queue 并不是同一个,而是将数据 pickle 后传给另一个进程的 Queue

用于父进程与子进程之间的通信或同一父进程的子进程之间通信


示例:

from multiprocessing import Process, Queue

def p_put(*args):
q.put(args)
print('Has put %s' % args) def p_get(*args):
print('%s wait to get...' % args)
print(q.get())
print('%s got it' % args) q = Queue()
p1 = Process(target=p_put, args=('p1', ))
p2 = Process(target=p_get, args=('p2', ))
p1.start()
p2.start()

输出结果:

Has put p1

p2 wait to get...

('p1',)

p2 got it


换成 queue 示例:

from multiprocessing import Process
import queue def p_put(*args):
q.put(args)
print('Has put %s' % args) def p_get(*args):
print('%s wait to get...' % args)
print(q.get())
print('%s got it' % args) q = queue.Queue()
p1 = Process(target=p_put, args=('p1', ))
p2 = Process(target=p_get, args=('p2', ))
p1.start()
p2.start()

输出结果:

Has put p1

p2 wait to get...


由于父进程启动子进程时是复制一份,所以每个子进程里也有一个空的队列,但是这些队列数据独立,所以 get 时会阻塞

Pipe

Pipe(管道) 是通过 socket 进行进程间通信的

所以步骤与建立 socket 连接相似:

建立连接、发送/接收数据(一端发送另一端不接受就会阻塞)、关闭连接

示例:

from multiprocessing import Pipe, Process

def f(conn):
conn.send('send by child')
print('child recv:', conn.recv())
conn.close() parent_conn, child_conn = Pipe() # 获得 Pipe 连接的两端
p = Process(target=f, args=(child_conn, ))
p.start()
print('parent recv:', parent_conn.recv())
parent_conn.send('send by parent')
p.join()

输出结果:

parent recv: send by child

child recv: send by parent

进程间数据共享

Manager

Manager 实现的是进程间共享数据

支持的可共享数据类型:

list
dict
Value
Array
Namespace
Queue queue.Queue
JoinableQueue queue.Queue
Event threading.Event
Lock threading.Lock
RLock threading.RLock
Semaphore threading.Semaphore
BoundedSemaphore threading.BoundedSemaphore
Condition threading.Condition
Barrier threading.Barrier
Pool pool.Pool

示例:

from multiprocessing import Manager, Process
import os def func():
m_dict['key'] = 'value'
m_list.append(os.getpid()) manager = Manager()
m_dict = manager.dict()
m_list = manager.list()
p_list = []
for i in range(10):
p = Process(target=func)
p.start()
p_list.append(p)
for p in p_list:
p.join()
print(m_list)
print(m_dict)

进程锁

打印时可能会出错,加锁可以避免

示例:

from multiprocessing import Lock, Process

def foo(n, l):
l.acquire()
print('hello world', n)
l.release() lock = Lock()
for i in range(100):
process = Process(target=foo, args=(i, lock))
process.start()

进程池 (pool)

同一时间最多有几个进程在 CPU 上运行

示例:

from multiprocessing import Pool
import time
import os def foo(n):
time.sleep(1)
print('In process', n, os.getpid())
return n def bar(*args):
print('>>done: ', args, os.getpid()) pool = Pool(processes=3)
print('主进程: ', os.getpid())
for i in range(10):
# pool.apply(func=foo, args=(i, ))
pool.apply_async(func=foo, args=(i, ), callback=bar)
print('end')
pool.close()
pool.join()

从程序运行过程中可以看出:同一时间最多只有3个进程在运行,类似于线程中的信号量

主进程在执行 callback 函数

注意

1.

pool.apply(func=foo, args=(i, )) 是串行执行

pool.apply_async(func=foo, args=(i, ), callback=bar) 是并行执行

2.

callback 函数会以 target 函数返回结果为参数,在 target 函数执行结束之后执行

callback 函数是主进程调用的

3.

如果不执行 join,程序会在主进程执行完成之后直接结束,不会等待子进程执行完成

Pool.join() 必须在 Pool.close() 之后执行,否则会报错:ValueError: Pool is still running

Python process (进程)的更多相关文章

  1. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...

  2. Python之进程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  3. Python之进程 3 - 进程池和multiprocess.Poll

    一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...

  4. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  5. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  6. python开发进程:共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  7. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  8. Python实例浅谈之五Python守护进程和脚本单例运行

    一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc ...

  9. *****Python之进程线程*****

    Python之进程线程 Python的threading模块   并发编程: 操作系统:位于底层硬件与应用软件之间的一层. 工作方式:向下管理硬件,向上提供接口. 进程:资源管理单位(容器) 线程:最 ...

随机推荐

  1. AcWing 901. 滑雪

    地址 https://www.acwing.com/problem/content/description/903/ 题目描述给定一个R行C列的矩阵,表示一个矩形网格滑雪场. 矩阵中第 i 行第 j ...

  2. Linux 的 Crond(二)

    最近由于工作中用到了crond,之前对crond不是很了解,只知道咋用,但是这次需要考虑好多情况,所以又深入了解了一下crond,下面就以下几个问题来谈谈crond. crond 中指定的job,如果 ...

  3. [Vue专题] 对比vue-cli2.x和vue-cli3.x的搭建

    简介:深入了解脚手架vue-cli2.x版本与3.x版本构建项目的区别 搭建前提条件: node环境 node是傻瓜式安装的,直接去官网下载安装不断下一步 命令行输入node -v查询版本号,有版本号 ...

  4. Golang 入门 : channel(通道)

    笔者在<Golang 入门 : 竞争条件>一文中介绍了 Golang 并发编程中需要面对的竞争条件.本文我们就介绍如何使用 Golang 提供的 channel(通道) 消除竞争条件. C ...

  5. golang:exported function Script should have comment or be unexported

    当自己定义的包被外部使用时,如果不遵循一定的规范,那么会出现讨厌的绿色纹条,还会警告: 虽然不会影响运行,但是也令人讨厌,那么如何解决这个问题呢? 为结构体或者变量或者方法添加注释,并且开头必须是结构 ...

  6. 终结 finalize() 和对象引用

    一.finalize() 方法 1. 为什么要有 finalize() 方法? 假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new 分配的内存,所以他 ...

  7. 《细说PHP》 第四版 样章 第二章 PHP的应用与发展 3

    2.3  PHP的开发优势 每种编程语言都有针对的领域,当然相同领域也有多个编程语言可以选择, 所以需要了解每种编程语言的优势和劣势,才能更好地去选择使用,在对的开发领域充分发挥它的优势,编写出最优质 ...

  8. 17-REST framework-Request与Response

    1.Django REST framework提供的视图的主要作用 1.控制序列化器的执行(检验,保存,转换数据) 2.控制数据库查询的执行 Request与Response 1.Request RE ...

  9. Mysql 5.7:更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'

    1.环境 在新服务器上重新安装了环境,原来是5.6的,就升级到了5.7版本. 2.问题 新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过免密码登录的方式更改密码. 输入 ...

  10. wpf 当DataGrid列模版是ComboBox时,显示信息

    ​ 实际工作中,有时DataGrid控件某一列显示数据是从Enum集合里面选择出来的,那这时候设置列模版为ComboBox就能满足需求.而关于显示的实际内容,直接是Enum的string()返回值可能 ...