当前位置: 首页 > wzjs >正文

郑州建设银行网站房贷网点在哪新昌网站制作

郑州建设银行网站房贷网点在哪,新昌网站制作,新浪云wordpress教程,WordPress用页面写文章目录 目标 Python版本 官方文档 概述 进程(Process)的基本概念 进程之间的通信方法 进程同步 进程间共享状态 实战 创建进程的基本语法 创建进程并传递复杂的参数 进程同步&进程通信 共享内存 基于服务器进程实现共享 基于队列实现进…

目录

目标

Python版本

官方文档

概述

进程(Process)的基本概念

进程之间的通信方法

进程同步

进程间共享状态

实战

创建进程的基本语法

创建进程并传递复杂的参数

进程同步&进程通信

共享内存

基于服务器进程实现共享

基于队列实现进程安全

生产者&消费者模型(基于队列)

生产者&消费者模型(基于管道) 


目标

        掌握进程的基本概念和使用方法,包括:创建进程、进程同步、进程间共享状态、进程通信。


Python版本

        Python 3.9.18


官方文档

multiprocessing — Process-based parallelismhttps://docs.python.org/3.9/library/multiprocessing.html


概述

进程(Process)的基本概念

        进程是操作系统分配资源的最小单位。线程则是操作系统的最小调度单位。它们之间的关系是:线程是进程的一个执行单元,多个线程可以共享进程的资源。Python官方对于进程做了如下描述:

multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads. Due to this, the multiprocessing module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows.

        从官方文档我们得到以下几点信息:

  • multiprocessing模块提供了进程相关的API,风格与线程的API类似。
  • 进程绕过了全局解释器锁(GIL),实现了真正的并行。因此能充分利用多核CPU,特别适合CPU密集型任务(如数据处理、图像处理、机器学习等)。
  • 支持本地和远程并发操作。

进程之间的通信方法

        最常见的通信方法有三种:队列(Queue)、管道(Pipe)、外部存储(如:多个进程读写同一个文件、数据库、各种中间件等)。官方文档的multiprocessing模块介绍了队列和管道:

Queues are thread and process safe.

The Pipe() function returns a pair of connection objects connected by a pipe which by default is duplex (two-way). 
The two connection objects returned by Pipe() represent the two ends of the pipe. Each connection object has send() and recv() methods (among others). 

意思是:

  • 队列在线程和进程上是安全的。
  • 管道的Pipe()方法返回的是一对连接对象,代表管道的两端。且两端的对象都可以收发数据。
  • 管道适合1对1的进程通信。

进程同步

官方文档

multiprocessing contains equivalents of all the synchronization primitives from threading.

        multiprocessing模块提供了与 threading 模块相同的同步原语,用于管理进程间的同步和共享资源的访问。同步原语的意思是,用于协调多线程的工具(如:锁、事件、信号量等)在multiprocessing模块中也都存在。


进程间共享状态

官方文档

        

As mentioned above, when doing concurrent programming it is usually best to avoid using shared state as far as possible. This is particularly true when using multiple processes.

However, if you really do need to use some shared data then multiprocessing provides a couple of ways of doing so.

Shared memory

Data can be stored in a shared memory map using Value or Array. 

Server process

A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.

官方不推荐进程间共享状态,但是仍然提供了两种进程间共享状态的方法:共享内存、通过服务器进程共享

共享内存:使用multiprocessing.Value或multiprocessing.Array让多个进程访问同一块共享内存。适用于小规模数据共享,性能较高。

通过服务器进程共享:multiprocessing.Manager() 创建一个服务进程,所有进程可以通过代理访问该进程中的对象。支持很多复杂数据类型


实战

创建进程的基本语法

import os
from multiprocessing import Process,current_process
import timedef fun(name):print(f"hello {name}")print(f"进程ID:{os.getpid()};进程名称:{current_process().name}")time.sleep(1)if __name__ == '__main__':process=Process(target=fun,name="MyProcess",args=("张三",))process.start()process.join()print("主线程结束。")

创建进程并传递复杂的参数

import os
from multiprocessing import Process, current_process
import timedef fun(*args, **kwargs):name, age, sex = argsprint(f"姓名:{name},年龄:{age},性别:{sex}")scores = kwargs.get("scores", {})teachers = kwargs.get("teachers", {})print("分数如下:")for subject in scores:print(subject, scores[subject], end="\n")print("各科目的老师如下:")for subject in teachers:print(subject, teachers[subject], end="\n")if __name__ == '__main__':student_info = ("张三", 18, "男")scores = {"语文": 90, "数学": 100, "英语": 99}teachers = {"语文": "李四", "数学": "王五", "英语": "赵六"}process = Process(target=fun,name="MyProcess",args=student_info,kwargs={"scores":scores, "teachers":teachers})process.start()process.join()print("主线程结束。")

输出

姓名:张三,年龄:18,性别:男
分数如下:
语文 90
数学 100
英语 99
各科目的老师如下:
语文 李四
数学 王五
英语 赵六
主线程结束。


进程同步&进程通信

共享内存

思考:通过以下案例可以发现一个问题为什么count作为全局变量,在函数中修改count值不需要提前用global修饰?

答:通过multiprocessing.Value创建的变量是共享内存的,它在多进程中是共享的。而global只针对当前进程中的多个进程实现共享全局变量。

import multiprocessing"""
注意,这里的'i'表示整数类型,不是存储count值的key。以下是我列出来的各种类型:'b'	布尔类型 (bool)'i'	整型 (int)'l'	长整型 (long)'f'	单精度浮点型 (float)'d'	双精度浮点型 (double)'c'	字符串(char)'u'	Unicode 字符串
"""
count = multiprocessing.Value('i', 0)def increment(count):for _ in range(100000):with count.get_lock():count.value += 1if __name__ == '__main__':process = multiprocessing.Process(target=increment, args=(count,))process2 = multiprocessing.Process(target=increment, args=(count,))process.start()process2.start()process.join()process2.join()print(count.value)

基于服务器进程实现共享

import multiprocessingdef increment(count, lock):for _ in range(10000):with lock:count.value += 1if __name__ == '__main__':manager = multiprocessing.Manager()count = manager.Value('i', 0)lock = manager.Lock()process = multiprocessing.Process(target=increment, args=(count,lock))process2 = multiprocessing.Process(target=increment, args=(count,lock))process.start()process2.start()process.join()process2.join()#输出:20000print(count.value)

基于队列实现进程安全

import multiprocessing
import osdef increment(queue):count = 0for _ in range(100000):count += 1print(f"当前进程是:{multiprocessing.current_process().name},count={count}")queue.put(count)if __name__ == '__main__':queue = multiprocessing.Queue()process = multiprocessing.Process(target=increment, name="process_1", args=(queue,))process2 = multiprocessing.Process(target=increment, name="process_2", args=(queue,))process.start()process2.start()process.join()process2.join()total_count = 0while not queue.empty():total_count += queue.get()#输出:200000print(total_count)

生产者&消费者模型(基于队列)

        如果用进程实现生产者消费者模型,光用内存共享或者服务器进程是不够的,因为内存共享和基于服务器进程只能实现进程通信,而不能实现任务存储,所以需要使用队列。大家可以看看我用多线程实现的生产者消费者模型,通过类比也能发现两者之间的相似之处。

需求

        每次生产出一只烤鸭,就会被等待的消费者消费。生产烤鸭的总量是100000只。

import multiprocessing
#最大烤鸭数量
max_duck_count=100000
# 烤鸭总量设置为内存共享
duck_count = multiprocessing.Value('i', 0)
def produce_duck(duck_queue,duck_count):#生产者不停地生产烤鸭。while True:with duck_count.get_lock():if duck_count.value>=max_duck_count:duck_queue.put(None)breakduck_count.value += 1duck_queue.put(duck_count.value)print(f"{multiprocessing.current_process().name}生产了第{duck_count.value}只烤鸭。")def consume_duck(duck_queue):#消费者不停地消费while True:duck=duck_queue.get()if duck is None:breakprint(f"{multiprocessing.current_process().name}消费了第{duck}只烤鸭。")if __name__ == '__main__':queue=multiprocessing.Queue()produce_duck_process_list = [multiprocessing.Process(target=produce_duck,name=f"生产者进程{_}",args=(queue,duck_count))for _ in range(5)]consume_duck_process_list = [multiprocessing.Process(target=consume_duck,name=f"消费者进程{_}",args=(queue,))for _ in range(3)]for produce_duck_process in produce_duck_process_list:produce_duck_process.start()for consume_duck_process in consume_duck_process_list:consume_duck_process.start()for produce_duck_process in produce_duck_process_list:produce_duck_process.join()for consume_duck_process in consume_duck_process_list:consume_duck_process.join()print("主线程结束。")

生产者&消费者模型(基于管道) 

需求

        每次生产出一只烤鸭,就会被等待的消费者消费。生产烤鸭的总量是100000只。

import multiprocessing
#最大烤鸭数量
max_duck_count=100000
# 烤鸭总量设置为内存共享
duck_count = multiprocessing.Value('i', 0)
def produce_duck(pipe,duck_count):#生产者不停地生产烤鸭。while True:with duck_count.get_lock():if duck_count.value>=max_duck_count:pipe.send(None)breakduck_count.value += 1pipe.send(duck_count.value)print(f"{multiprocessing.current_process().name}生产了第{duck_count.value}只烤鸭。")def consume_duck(pipe):#消费者不停地消费while True:duck=pipe.recv()if duck is None:breakprint(f"{multiprocessing.current_process().name}消费了第{duck}只烤鸭。")if __name__ == '__main__':produce_duck_pipe,consume_duck_pipe=multiprocessing.Pipe()produce_duck_process_list = [multiprocessing.Process(target=produce_duck,name=f"生产者进程{_}",args=(produce_duck_pipe,duck_count))for _ in range(5)]consume_duck_process_list = [multiprocessing.Process(target=consume_duck,name=f"消费者进程{_}",args=(consume_duck_pipe,))for _ in range(3)]for produce_duck_process in produce_duck_process_list:produce_duck_process.start()for consume_duck_process in consume_duck_process_list:consume_duck_process.start()for produce_duck_process in produce_duck_process_list:produce_duck_process.join()for consume_duck_process in consume_duck_process_list:consume_duck_process.join()print("主线程结束。")


文章转载自:

http://Ak5Prfgp.sgfpn.cn
http://Jz180k32.sgfpn.cn
http://LhuCkZmt.sgfpn.cn
http://8sZADOKa.sgfpn.cn
http://JBw4fSot.sgfpn.cn
http://SA8xo0W7.sgfpn.cn
http://PYQ3FD0q.sgfpn.cn
http://GjIIjVgT.sgfpn.cn
http://gJLnMDTP.sgfpn.cn
http://5Ha2CbD3.sgfpn.cn
http://YwZRivBD.sgfpn.cn
http://U4QzrZ9E.sgfpn.cn
http://kykQANEJ.sgfpn.cn
http://p95kZ2O8.sgfpn.cn
http://Ifqw6BPG.sgfpn.cn
http://9akyIJEr.sgfpn.cn
http://HZA6FgXo.sgfpn.cn
http://s0RkLaE8.sgfpn.cn
http://8ZNYzpPd.sgfpn.cn
http://bf5MhiIq.sgfpn.cn
http://utTsqwID.sgfpn.cn
http://ah3Co2ea.sgfpn.cn
http://z3jqc09o.sgfpn.cn
http://c2pwJDf2.sgfpn.cn
http://ohZdL3Lk.sgfpn.cn
http://OdVRdX0w.sgfpn.cn
http://9KEcczXj.sgfpn.cn
http://eD4P9m8Q.sgfpn.cn
http://UmwGr65Y.sgfpn.cn
http://F8EU5oDX.sgfpn.cn
http://www.dtcms.com/wzjs/698177.html

相关文章:

  • 微网站注册前端h5是什么意思
  • 自做衣服网站新闻资讯网站php源码
  • wordpress调样式seo没什么作用了
  • 做全景图有哪些网站wordpress slides
  • 织梦手机网站分亨链接怎么做江阴青阳道路建设网站
  • 太原建站的模板设计师培训资料
  • 邻水县规划和建设局 网站阳朔到桂林游船时间表
  • 宿迁做网站建设的公司新浪网页版登录
  • 建设网站的模板dw做网站地图
  • 安全的营销型网站制作做网站添加mp3
  • 网站semseo先做哪个做wow宏的网站
  • 营销相关网站市场咨询公司排名
  • 成都画时网站建设动漫制作专业有本科吗
  • 网站建设如何实现检索功能上海监理建设协会网站
  • 面料 做网站wordpress不同页面广告
  • 邯郸网站制作设计wordpress 创建网站
  • 建设网站好公司哪家好wape
  • 郑州彩票网站开发宁波营销型网站建设
  • 中国联通网站备案网站后台更新文章 前台不显示
  • p2p网站建设源码如何在国外网站做翻译兼职
  • 绵阳银行网站建设专门app软件开发公司
  • 手工建站与模板网站的区别给视频做特效的网站
  • 东莞最便宜网站建设网页代码查看
  • 网站搜索查询建网站需要哪些技术
  • 京东网站开发多少钱建设集团网站方案
  • 郑州做网站的大公司wordpress 算数 验证码
  • 网站建设的需求要素一个网站有多大
  • 惠州企业自助建站人力资源公司加盟合作
  • 城乡建设部网站混凝土7天强度免费域名注册永久
  • 做水印的网站建设信用卡银行积分商城网站