简介

线程理解中介绍过,再回顾一遍,一个应用程序由多个进程组成,一个进程由多个线程组成,由操作系统根据优先级、时间片来绝对线程的运行

进程

python的进程不同于线程,在主流的cpython解释器下,无论创建多少线程,都只会在一个cpu上运行,与java等语言有所区别,进程则与其他语言类似,会占用对应的cpu资源,因此进程相对于线程来说开销会大一点,进程适用于计算密集型程序

常见的进程创建方式

1.multiprocessing的Process创建进程

from multiprocessing import Process
import time def run(name):
time.sleep(10)
print(f'process statrt:{name}') p = Process(target=run, args=('test1',), name='test1')
p.start()

2.subprocess创建进程

subprocess创建进程一般用于命令的执行,详细信息可见subprocess文章

stderr=subprocess.STDOUT:代表将错误输出也输出到stdout

import subprocess

command = "adb devices"
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
print(p.stdout.readlines())

进程间通信

由于进程的内存空间是相对独立的,因此无法像线程使用全局变量的方式去进行进程间通信,需要借助一定的中间媒介,下面介绍几种进程间通信的方式。

1.Queue(队列)

此处不是queue中的队列,是mutiprocessing中的队列

from multiprocessing import Process, Queue

queue = Queue()
def put(msg):
queue.put(msg) def get():
msg = queue.get()
print(f"msg:{msg}") p = Process(target=put, args=("message",))
p.start()
p2 = Process(target=get)
p2.start()

2.Pipe

适用于两个进程间通信,recv、send, 与socket.socketpair()类似

管道:适用于两个线程之间的数据交互,感觉类似于socket通信

from multiprocessing import Process, Pipe

send_p, recv_p = Pipe()
def send(msg):
send_p.send(msg) def recv():
msg = recv_p.recv()
print(f"msg:{msg}") p = Process(target=send, args=('test',))
p.start()
p2 = Process(target=recv)
p2.start()

3.Manager

推荐使用这种方式,支持 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.

from multiprocessing import Process, Manager, Lock

manager = Manager()
# 字典类型
d = manager.dict({'count':0})
# 列表类型
l = manager.list([])
# 加锁,防止数据混乱
lock = Lock()
def start_process1(d, l:list):
lock.acquire()
d['count'] += 1
l.append(d['count'])
lock.release()
print(d['count'])
print(l) p_list = [] for i in range(10):
p = Process(target=start_process1, args=(d, l))
p.start()
p_list.append(p) for p in p_list:
p.join()

4.socket通信

支持跨进程、跨语言通信

例如:socket.socketpair()

from multiprocessing import Process
import socket socket1, socket2 = socket.socketpair()
def send(msg):
print(socket1)
print(socket2)
# 关闭不需要的socket
socket2.close()
socket1.send(msg.encode('utf8')) def recv():
print(socket1)
socket1.close()
print(socket2)
print(socket2.recv(1024)) p = Process(target=send, args=('test',))
p.start()
p2 = Process(target=recv)
p2.start()

5.中间介质:文件、事件中心等

此处不再赘述

进程池

1.使用multiprocessing中的Pool模块

from multiprocessing import Pool
import time def start_process(n):
print(f'{n} process start')
time.sleep(10)
print(f'{n} process finish')
return n def callback(n):
"""
回调参数为进程的return的返回值
"""
print(f"callback:n:{n}") def error_callback():
print(f"error_callback") pool = Pool(4)
for i in range(5):
# 异步执行
pool.apply_async(func=start_process, args=(str(i+1),),callback=callback)
pool.close()
pool.join()
for i in range(5):
# 同步执行
pool.apply(func=start_process, args=(str(i+1),))
pool.close()
pool.join()
# 批量对一个序列中的元素进行操作,同步
pool.map(func=start_process, iterable=[1,2,3,4])
pool.close()
pool.join()
# 批量对一个序列中的元素进行操作,异步
pool.map_async(func=start_process, iterable=[1,2,3,4], callback=callback)
pool.close()
pool.join()
print('process exec finish')

2.使用concurrent.futures下的ProcessPoolExecutor

默认如果不设置进程池的大小,则为cpu核心数或者1

ProcessPoolExecutor默认是异步的

使用submit

from concurrent.futures import ProcessPoolExecutor
import time def start_process(n, m):
print(f'{n} process start')
time.sleep(10)
print(f'{n} process finish')
return n, m pool = ProcessPoolExecutor(4)
ret_list = []
for i in range(5):
# 多个参数使用带参方式传入
ret = pool.submit(fn=start_process, n=str(i+1), m=str(i))
ret_list.append(ret)
for ret in ret_list:
print(ret.result())
# 等待进程全部结束再继续运行,相当于join
pool.shutdown(wait=True)

使用map,需要注意的是多参数传入时,最好使用args传入

def start_process_muti(n, m):
print(f'{n} process start')
time.sleep(10)
print(f'{n} process finish')
return n, m # 需要使用args接收多参数,防止出现缺少某一个位置参数的问题
def start_process_do(args):
return start_process_muti(*args) data = [(i,j) for i in range(5) for j in range(5)]
print(data)
ret = pool.map(start_process_do, data)
print(list(ret))

python 进程理解的更多相关文章

  1. python——进程、线程、协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...

  2. python进程、多进程

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

  3. python 进程和线程(代码知识部分)

    二.代码知识部分 一 multiprocessing模块介绍: python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情 ...

  4. [ python ] 进程的操作

    目录 (见右侧目录栏导航)- 1. 前言- 2. multiprocess模块- 2.1 multiprocess.Process模块    - 2.2 使用Process模块创建进程    - 2. ...

  5. 用 C# 来守护 Python 进程

    背景 目前我主要负责的一个项目是一个 C/S 架构的客户端开发,前端主要是通过 WPF 相关技术来实现,后端是通过 Python 来实现,前后端的数据通信则是通过 MQ 的方式来进行处理.由于 Pyt ...

  6. python 进程和线程-线程和线程变量ThreadLocal

    线程 线程是由若干个进程组成的,所以一个进程至少包含一个线程:并且线程是操作系统直接支持的执行单元.多任务可以由多进程完成,也可由一个进程的多个线程来完成 Python的线程是真正的Posix Thr ...

  7. 第 10 章 python进程与多进程

    一.背景知识 顾明思义,进程即正在执行的一个过程,进程是对正在云的程序的一个抽象. 进程的概念起源与操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一,操作系统的其他所 ...

  8. python——进程基础

    我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...

  9. 使用gdb调试Python进程

    使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...

随机推荐

  1. 海量数据存储ClickHouse

    ClickHouse介绍 ClickHouse的由来和应用场景 俄罗斯Yandex在2016年开源,使用C++编写的列式存储数据库,近几年在OLAP领域大范围应用 官网:https://clickho ...

  2. 使用 VS Code + Markdown 编写 PDF 文档

    背景介绍 作为一个技术人员,基本都需要编写技术相关文档,而且大部分技术人员都应该掌握 markdown 这个技能,使用 markdown 来编写并生成 PDF 文档将会是一个不错的体验,以下就介绍下如 ...

  3. 好客租房56-props深入(3props校验-约束规则)

    1常见类型:Array,bool,func,number,object,string 2React:element 3必填项:isRequred 4特定结构的想:shape({}) //导入react ...

  4. 好客租房57-props深入(4props的默认值)

    1给props设置默认值 //导入react     import React from 'react'     import ReactDOM from 'react-dom'     import ...

  5. linux篇-linux数据库mysql的安装

    1数据库文件放到opt下面 2赋予权限775 3运行脚本 4运行成功 5数据库操作 密码修改并刷新 权限修改,允许外部设备访问 6工具连接 7附录 1.显示当前数据库服务器中的数据库列表: mysql ...

  6. 好客租房9-jsx的学习目标

    1能够知道什么是jsx 2能够使用jsx创建react元素 3能够在jsx使用javascript表达式 4能够使用jsx的条件渲染和列表渲染 5能够给jsx添加样式 jsx的基本使用 jsx中使用j ...

  7. 理解RESTful Api设计

    REST REST(REpresentational State Transfer)是 Roy Fielding 博士于 2000 年在他的博士论文中提出来的一种软件架构风格(一组架构约束条件和原则) ...

  8. Hadoop常见shell命令

    Hadoop中常见的shell命令 1.如何将Linux本地的数据上传到HDFS中? hadoop fs -put 本地的文件 HDFS中的目录hdfs dfs -put 本地的文件 HDFS中的目录 ...

  9. Mac下最好用的SSH连接客户端 (Termius)

    Termius是微软的一款SSH终端工具,它支持多平台.而且操作界面十分ha好看且简洁,今天分享给大家️ 软件下载 关注下方公众号,回复termius获取下载地址   软件功能介绍 Termius M ...

  10. git clone 问题

    转自 git clone出现 fatal: unable to access 'https://github.com/...'的解决办法(亲测有效) - 山村码农 - 博客园 (cnblogs.com ...