網(wǎng)站首頁 編程語言 正文
python中的并發(fā)有三種形式,多進程、多線程、協(xié)程。執(zhí)?并發(fā)任務(wù)的?的是為了提?程序運?的效率。
一、多進程的創(chuàng)建:多進程的創(chuàng)建方法有兩種:
1、通過Process創(chuàng)建多進程 Process語法結(jié)構(gòu):
Process(group, target, name, args, kwargs)
group:指定進程組,?多數(shù)情況下?不到
target:表示調(diào)用對象,即子進程要執(zhí)行的任務(wù)
name:子進程的名稱,可以不設(shè)定
args:給target指定的函數(shù)傳遞的參數(shù),以元組的?式傳遞
kwargs:給target指定的函數(shù)傳遞命名參數(shù)
Process常用方法:
p.start() 啟動進程,并調(diào)用該子進程中的p.run()方法
p.join(timeout):主進程等待?進程執(zhí)?結(jié)束再結(jié)束,timeout是可選的超時時間
is_alive():判斷進程?進程是否還存活
p.run() 進程啟動時運行的方法,正是它去調(diào)用target指定的函數(shù)
p.terminate() ?即終??進程
(1)首先,定義一個待調(diào)用的函數(shù):
import os
from multiprocessing import Process
def add(name,num):
nums = 0
for i in range(num+1):
nums = nums+i
print("用戶%s:\n 相加結(jié)果為:%s \n 當(dāng)前進程id為:%s \n 當(dāng)前子進程的父進程id: %s"%(name,nums,os.getpid(),os.getppid()))
(2)創(chuàng)建并啟動一個進程
def test1():
'''啟動一個進程調(diào)用'''
name= '王五'
p = Process(target=add,args=(name,10,))
p.start()
p.join()
其中,p.join()方法可以讓主進程等待子進程結(jié)束之后再結(jié)束,如果不加這個方法,主進程結(jié)束,子進程還沒有結(jié)束。
(2)創(chuàng)建并啟動多個進程
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、通過進程池創(chuàng)建并啟動多進程
進程池可以提供指定數(shù)量的進程給用戶使用,即當(dāng)有新的請求提交到進程池中時,如果池未滿,則會創(chuàng)建一個新的進程用來執(zhí)行該請求;反之,如果池中的進程數(shù)已經(jīng)達到規(guī)定最大值,那么該請求就會等待,只要池中有進程空閑下來,該請求就能得到執(zhí)行。
Pool(numprocess, initializer, initargs)
numprocess 是要創(chuàng)建的進程數(shù)。如果省略此參數(shù),默認(rèn)為cpu的最大核心數(shù)。
Initializer是每個工作進程啟動時要執(zhí)行的可調(diào)用對象。
Initargs 傳遞給 initializer 的參數(shù)元祖,默認(rèn)為 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、通過繼承的方法創(chuàng)建多進程
(1)首先創(chuàng)建一個進程
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 相加結(jié)果為:%s \n 當(dāng)前進程id為:%s \n 當(dāng)前子進程的父進程id: %s"\
%(self.name,self.number,os.getpid(),os.getppid()))
(2)啟動一個進程
def call_Sub0():
'''啟動一個進程調(diào)用'''
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("當(dāng)前主進程id:",os.getpid())
call_Sub1()
print("計算結(jié)束!")
4、進程創(chuàng)建與啟動完整代碼
import os
from multiprocessing import Process
def add(name,num):
nums = 0
for i in range(num+1):
nums = nums+i
print("用戶%s:\n 相加結(jié)果為:%s \n 當(dāng)前進程id為:%s \n 當(dāng)前子進程的父進程id: %s"%(name,nums,os.getpid(),os.getppid()))
def test1():
'''啟動一個進程調(diào)用'''
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()
'''
進程池:可以提供指定數(shù)量的進程給用戶使用,即當(dāng)有新的請求提交到進程池中時,
如果池未滿,則會創(chuàng)建一個新的進程用來執(zhí)行該請求;反之,如果池中的進程數(shù)已經(jīng)達到規(guī)定最大值,
那么該請求就會等待,只要池中有進程空閑下來,該請求就能得到執(zhí)行。
'''
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 相加結(jié)果為:%s \n 當(dāng)前進程id為:%s \n 當(dāng)前子進程的父進程id: %s"\
%(self.name,self.number,os.getpid(),os.getppid()))
def call_Sub0():
'''啟動一個進程調(diào)用'''
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("當(dāng)前主進程id:",os.getpid())
call_Sub1()
print("計算結(jié)束!")
原文鏈接:https://blog.csdn.net/qq_15060477/article/details/128112144
相關(guān)推薦
- 2022-02-14 centos7系統(tǒng)部署k8s集群詳細介紹_Linux
- 2022-03-17 總結(jié)C#處理異常的方式_C#教程
- 2022-08-15 對稱式加密和非對稱加密的對比
- 2022-03-18 C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解_C 語言
- 2023-04-12 python的去重以及數(shù)據(jù)合并的用法說明_python
- 2022-11-16 Android?十六進制狀態(tài)管理實例詳解_Android
- 2022-09-06 React父組件調(diào)用子組件中的方法實例詳解_React
- 2022-11-05 Nginx監(jiān)控模塊(vts模塊)詳解_nginx
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支