網站首頁 編程語言 正文
python中的并發有三種形式,多進程、多線程、協程。執?并發任務的?的是為了提?程序運?的效率。
一、多進程的創建:多進程的創建方法有兩種:
1、通過Process創建多進程 Process語法結構:
Process(group, target, name, args, kwargs)
group:指定進程組,?多數情況下?不到
target:表示調用對象,即子進程要執行的任務
name:子進程的名稱,可以不設定
args:給target指定的函數傳遞的參數,以元組的?式傳遞
kwargs:給target指定的函數傳遞命名參數
Process常用方法:
p.start() 啟動進程,并調用該子進程中的p.run()方法
p.join(timeout):主進程等待?進程執?結束再結束,timeout是可選的超時時間
is_alive():判斷進程?進程是否還存活
p.run() 進程啟動時運行的方法,正是它去調用target指定的函數
p.terminate() ?即終??進程
(1)首先,定義一個待調用的函數:
import os
from multiprocessing import Process
def add(name,num):
nums = 0
for i in range(num+1):
nums = nums+i
print("用戶%s:\n 相加結果為:%s \n 當前進程id為:%s \n 當前子進程的父進程id: %s"%(name,nums,os.getpid(),os.getppid()))
(2)創建并啟動一個進程
def test1():
'''啟動一個進程調用'''
name= '王五'
p = Process(target=add,args=(name,10,))
p.start()
p.join()
其中,p.join()方法可以讓主進程等待子進程結束之后再結束,如果不加這個方法,主進程結束,子進程還沒有結束。
(2)創建并啟動多個進程
def test3():
names = ['王五','趙六','王麻子']
process_list=[]
for name in names:
p = Process(target=add,args=(name,10,))
p.start()
process_list.append(p)
for j in process_list:
j.join()
2、通過進程池創建并啟動多進程
進程池可以提供指定數量的進程給用戶使用,即當有新的請求提交到進程池中時,如果池未滿,則會創建一個新的進程用來執行該請求;反之,如果池中的進程數已經達到規定最大值,那么該請求就會等待,只要池中有進程空閑下來,該請求就能得到執行。
Pool(numprocess, initializer, initargs)
numprocess 是要創建的進程數。如果省略此參數,默認為cpu的最大核心數。
Initializer是每個工作進程啟動時要執行的可調用對象。
Initargs 傳遞給 initializer 的參數元祖,默認為 None
def test4():
from multiprocessing import Pool
'''啟動多個進程2:進程池'''
p = Pool(5)
names = ['王五','趙六','王麻子']
for name in names:
p.apply_async(add,args=(name,10))
p.close()
p.join()
3、通過繼承的方法創建多進程
(1)首先創建一個進程
class SubProcess(Process):
def __init__(self,name,number):
super(SubProcess, self).__init__()
self.name = name
self.number = number
def run(self):
sums = 0
for i in range(self.number):
sums = sums+i
print("用戶%s:\n 相加結果為:%s \n 當前進程id為:%s \n 當前子進程的父進程id: %s"\
%(self.name,self.number,os.getpid(),os.getppid()))
(2)啟動一個進程
def call_Sub0():
'''啟動一個進程調用'''
name = '張三'
p = SubProcess(name,10)
p.start()
p.join()
(3)通過列表啟動多個進程
def call_Sub1():
'''啟動多個進程1'''
names = ['王五','趙六','王麻子']
process_list=[]
for name in names:
p = SubProcess(name,10)
p.start()
process_list.append(p)
for j in process_list:
j.join()
if __name__ == '__main__':
print("當前主進程id:",os.getpid())
call_Sub1()
print("計算結束!")
4、進程創建與啟動完整代碼
import os
from multiprocessing import Process
def add(name,num):
nums = 0
for i in range(num+1):
nums = nums+i
print("用戶%s:\n 相加結果為:%s \n 當前進程id為:%s \n 當前子進程的父進程id: %s"%(name,nums,os.getpid(),os.getppid()))
def test1():
'''啟動一個進程調用'''
name= '王五'
p = Process(target=add,args=(name,10,))
p.start()
p.join()
def test3():
'''啟動多個進程2'''
names = ['王五','趙六','王麻子']
process_list=[]
for name in names:
p = Process(target=add,args=(name,10,))
p.start()
process_list.append(p)
for j in process_list:
j.join()
'''
進程池:可以提供指定數量的進程給用戶使用,即當有新的請求提交到進程池中時,
如果池未滿,則會創建一個新的進程用來執行該請求;反之,如果池中的進程數已經達到規定最大值,
那么該請求就會等待,只要池中有進程空閑下來,該請求就能得到執行。
'''
def test4():
from multiprocessing import Pool
'''啟動多個進程2:進程池'''
p = Pool(5)
names = ['王五','趙六','王麻子']
for name in names:
p.apply_async(add,args=(name,10))
p.close()
p.join()
class SubProcess(Process):
def __init__(self,name,number):
super(SubProcess, self).__init__()
self.name = name
self.number = number
def run(self):
sums = 0
for i in range(self.number):
sums = sums+i
print("用戶%s:\n 相加結果為:%s \n 當前進程id為:%s \n 當前子進程的父進程id: %s"\
%(self.name,self.number,os.getpid(),os.getppid()))
def call_Sub0():
'''啟動一個進程調用'''
name = '張三'
p = SubProcess(name,10)
p.start()
p.join()
def call_Sub1():
'''啟動多個進程1'''
names = ['王五','趙六','王麻子']
process_list=[]
for name in names:
p = SubProcess(name,10)
p.start()
process_list.append(p)
for j in process_list:
j.join()
if __name__ == '__main__':
print("當前主進程id:",os.getpid())
call_Sub1()
print("計算結束!")
原文鏈接:https://blog.csdn.net/qq_15060477/article/details/128112144
相關推薦
- 2022-01-21 吃透Mybatis源碼-緩存的理解(三)
- 2022-11-14 UNIX環境高級編程筆記
- 2022-08-31 C語言數據結構之單鏈表與雙鏈表的增刪改查操作實現_C 語言
- 2022-08-18 Python壓縮包處理模塊zipfile和py7zr操作代碼_python
- 2022-06-09 ASP.NET?Core記錄日志_實用技巧
- 2023-02-27 C++文件讀取的4種情況匯總_C 語言
- 2022-12-13 一文詳解Python加解壓文件gzip庫的操作_python
- 2022-01-19 iview-admin 富文本編輯器(wangEditor)菜單無法選中解決方案
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支