国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

python多進程控制的教程講解(附示例)

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 14:11:36
文檔

python多進程控制的教程講解(附示例)

python多進程控制的教程講解(附示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務(wù)器為多核CPU時效果更
推薦度:
導(dǎo)讀python多進程控制的教程講解(附示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務(wù)器為多核CPU時效果更

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

multiprocessing簡介

multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務(wù)器為多核CPU時效果更好,類似于threading模塊。相對于多線程,多進程由于獨享內(nèi)存空間,更穩(wěn)定安全,在運維里面做些批量操作時,多進程有更多適用的場景

multiprocessing包提供了本地和遠程兩種并發(fā)操作,有效的避開了使用子進程而不是全局解釋鎖的線程,因此,multiprocessing可以有效利用到多核處理

Process類

在multiporcessing中,通過Process類對象來批量產(chǎn)生進程,使用start()方法來啟動這個進程

1.語法

multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)

group: 這個參數(shù)一般為空,它只是為了兼容threading.Tread
target: 這個參數(shù)就是通過run()可調(diào)用對象的方法,默認為空,表示沒有方法被調(diào)用
name: 表示進程名
args: 傳給target調(diào)用方法的tuple(元組)參數(shù)
kwargs: 傳給target調(diào)用方法的dict(字典)參數(shù)

2.Process類的方法及對象

run()
該方法是進程的運行過程,可以在子類中重寫此方法,一般也很少去重構(gòu)

start()
啟動進程,每個進程對象都必須被該方法調(diào)用

join([timeout])
等待進程終止,再往下執(zhí)行,可以設(shè)置超時時間

name
可以獲取進程名字,多個進程也可以是相同的名字

is_alive()
返回進程是否還存活,True or False,進程存活是指start()開始到子進程終止

daemon
守護進程的標記,一個布爾值,在start()之后設(shè)置該值,表示是否后臺運行
注意:如果設(shè)置了后臺運行,那么后臺程序不運行再創(chuàng)建子進程

pid
可以獲取進程ID

exitcode
子進程退出時的值,如果進程還沒有終止,值將是None,如果是負值,表示子進程被終止

terminate()
終止進程,如果是Windows,則使用terminateprocess(),該方法對已經(jīng)退出和結(jié)束的進程,將不會執(zhí)行

以下為一個簡單的例子:

#-*- coding:utf8 -*- 
import multiprocessing
import time

def work(x):
 time.sleep(1)
 print time.ctime(),'這是子進程[{0}]...'.format(x)

if __name__ == '__main__':
 for i in range(5):
 p = multiprocessing.Process(target=work,args=(i,))
 print '啟動進程數(shù):{0}'.format(i)
 p.start()
 p.deamon = True

1225714763-5993b00b4eb7b_articlex.png

當然也可以顯示每個進程的ID

#-*- coding:utf8 -*- 
import multiprocessing
import time
import os

def work(x):
 time.sleep(1)
 ppid = os.getppid()
 pid = os.getpid()
 print time.ctime(),'這是子進程[{0},父進程:{1},子進程:{2}]...'.format(x,ppid,pid)

if __name__ == '__main__':
 for i in range(5):
 p = multiprocessing.Process(target=work,args=(i,))
 print '啟動進程數(shù):{0}'.format(i)
 p.start()
 p.deamon = True

2901093574-59a50a956cd8e_articlex.png

但在實際使用的過程中,并不只是并發(fā)完就可以了,比如,有30個任務(wù),由于服務(wù)器資源有限,每次并發(fā)5個任務(wù),這里還涉及到30個任務(wù)怎么獲取的問題,另外并發(fā)的進程任務(wù)執(zhí)行時間很難保證一致,尤其是需要時間的任務(wù),可能并發(fā)5個任務(wù),有3個已經(jīng)執(zhí)行完了,2個還需要很長時間執(zhí)行,總不能等到這兩個進程執(zhí)行完了,再繼續(xù)執(zhí)行后面的任務(wù),因此進程控制就在此有了使用場景,可以利用Process的方法和一些multiprocessing的包,類等結(jié)合使用

進程控制及通信常用類

一、Queue類

類似于python自帶的Queue.Queue,主要用在比較小的隊列上面
語法:

multiprocessing.Queue([maxsize])

類方法:
qsize()
返回隊列的大致大小,因為多進程或者多線程一直在消耗隊列,因此該數(shù)據(jù)不一定正確

empty()
判斷隊列是否為空,如果是,則返回True,否則False

full()
判斷隊列是否已滿,如果是,則返回True,否則False

put(obj[, block[, timeout]])
將對象放入隊列,可選參數(shù)block為True,timeout為None

get()
從隊列取出對象

#-*- coding:utf8 -*-
from multiprocessing import Process, Queue

def f(q):
 q.put([42,None,'hi'])

if __name__ == '__main__':
 q = Queue()
 p = Process(target=f, args=(q,))
 p.start()
 print q.get() #打印內(nèi)容: [42,None,'hi']
 p.join()

二、Pipe類

pipe()函數(shù)返回一對對象的連接,可以為進程間傳輸消息,在打印一些日志、進程控制上面有一些用處,Pip()對象返回兩個對象connection,代表兩個通道,每個connection對象都有send()和recv()方法,需要注意的是兩個或以上的進程同時讀取或者寫入同一管道,可能會導(dǎo)致數(shù)據(jù)混亂,測試了下,是直接覆蓋了。另外,返回的兩個connection,如果一個是send()數(shù)據(jù),那么另外一個就只能recv()接收數(shù)據(jù)了

#-*- coding:utf8 -*-
from multiprocessing import Process, Pipe
import time
def f(conn,i):
 print '[{0}]已經(jīng)執(zhí)行到子進程:{1}'.format(time.ctime(),i)
 time.sleep(1)
 w = "[{0}]hi,this is :{1}".format(time.ctime(),i)
 conn.send(w)
 conn.close()

if __name__ == '__main__':
 reader = []
 parent_conn, child_conn = Pipe()
 for i in range(4):
 p = Process(target=f, args=(child_conn,i))
 p.start()
 reader.append(parent_conn)
 p.deamon=True

 # 等待所有子進程跑完
 time.sleep(3)
 print '
[{0}]下面打印child_conn向parent_conn傳輸?shù)男畔?'.format(time.ctime())
 for i in reader:
 print i.recv()

輸出為:

3420055133-59c4d415e67dc_articlex.png

三、Value,Array

在進行并發(fā)編程時,應(yīng)盡量避免使用共享狀態(tài),因為多進程同時修改數(shù)據(jù)會導(dǎo)致數(shù)據(jù)破壞。但如果確實需要在多進程間共享數(shù)據(jù),multiprocessing也提供了方法Value、Array

from multiprocessing import Process, Value, Array

def f(n, a):
 n.value = 3.1415927
 for i in range(len(a)):
 a[i] = -a[i]

if __name__ == '__main__':
 num = Value('d',0.0)
 arr = Array('i', range(10))

 p = Process(target=f, args=(num, arr))
 p.start()
 p.join()

 print num.value
 print arr[:]

*print
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]*

四、Manager進程管理模塊

Manager類管理進程使用得較多,它返回對象可以操控子進程,并且支持很多類型的操作,如: list, dict, Namespace、lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value, Array,因此使用Manager基本上就夠了

from multiprocessing import Process, Manager

def f(d, l):
 d[1] = '1'
 d['2'] = 2
 d[0.25] = None
 l.reverse()

if __name__ == '__main__':
 with Manager() as manager:
 d = manager.dict()
 l = manager.list(range(10))

 p = Process(target=f, args=(d, l))
 p.start()
 p.join() #等待進程結(jié)束后往下執(zhí)行
 print d,'
',l

輸出:
{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
可以看到,跟共享數(shù)據(jù)一樣的效果,大部分管理進程的方法都集成到了Manager()模塊了

五、對多進程控制的應(yīng)用實例

 #-*- coding:utf8 -*-
 from multiprocessing import Process, Queue
 import time
 
 def work(pname,q):
 time.sleep(1)
 print_some = "{0}|this is process: {1}".format(time.ctime(),pname)
 print print_some
 q.put(pname)
 
 if __name__ == '__main__':
 p_manag_num = 2 # 進程并發(fā)控制數(shù)量2
 # 并發(fā)的進程名
 q_process = ['process_1','process_2','process_3','process_4','process_5']
 q_a = Queue() # 將進程名放入隊列
 q_b = Queue() # 將q_a的進程名放往q_b進程,由子進程完成
 
 for i in q_process:
 q_a.put(i)
 
 p_list = [] # 完成的進程隊列
 while not q_a.empty():
 if len(p_list) <= 2:
 pname=q_a.get()
 p = Process(target=work, args=(pname,q_b))
 p.start()
 p_list.append(p)
 print pname
 
 for p in p_list:
 if not p.is_alive():
 p_list.remove(p)
 
 # 等待5秒,預(yù)估執(zhí)行完后看隊列通信信息
 # 當然也可以循環(huán)判斷隊列里面的進程是否執(zhí)行完成
 time.sleep(5)
 print '打印p_b隊列:'
 while not q_b.empty():
 print q_b.get()

執(zhí)行結(jié)果:

1132967470-59a5182251923_articlex.png

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

python多進程控制的教程講解(附示例)

python多進程控制的教程講解(附示例):本篇文章給大家?guī)淼膬?nèi)容是關(guān)于python多進程控制的教程講解(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。multiprocessing簡介multiprocessing是python自帶的多進程模塊,可以大批量的生成進程,在服務(wù)器為多核CPU時效果更
推薦度:
標簽: 教程 實例 python
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲欧美激情精品一区二区 | 国产精品一区二区三区四区 | 久久66热re国产毛片基地 | 欧美一区精品二区三区 | 欧美伊香蕉久久综合类网站 | 国内精品伊人久久久久妇 | 麻豆成人在线 | 精品国产欧美一区二区三区成人 | 日本成人a | 久久精品国产999久久久 | 看国产一级毛片 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲综合影院 | 国产欧美综合在线一区二区三区 | 欧美成人久久电影香蕉 | 悠悠久久| 在线免费一区二区 | 欧美日韩国产另类一区二区三区 | 黄色a一级 | 在线免费观看国产视频 | 精品国产综合成人亚洲区 | 久久精品国产一区二区三区不卡 | 国产精品美女久久久久 | 久久伊人一区二区三区四区 | 麻豆精品国产 | 久久se精品一区二区国产 | 亚洲日韩在线观看 | 免费在线一级毛片 | 亚洲精品国产精品精 | 欧美在线观看一区二区 | 精品不卡 | 在线视频欧美日韩 | 护士精品一区二区三区 | 国产精品不卡 | 一道精品一区二区三区 | 亚洲欧美偷拍另类 | 国产女同一区二区三区五区 | 色翁荡息又大又硬又粗又爽 | 精品一区二区三区亚洲 | 伊人婷婷| 亚洲码欧美码一区二区三区 |