~~併發編程(三):開啓進程~~

<center><h3>進擊のpython</h3></center> *****python

併發編程——開啓進程


上一節說了那麼多關於進程的東西,那這一節就嘗試着本身開啓一下進程編程

這一節咱們能夠嘗試着使用multiprocessing模塊開啓進程windows

經過掌握multiprocessing模塊開啓進程的兩種方式多線程

是咱們在後面的學習的基礎,因此必定要好好看併發


multiprocessing模塊

首先,因爲語言特色,python的多線程沒辦法使用多核優點ide

因此說,但凡咱們想要利用到多核的優點,在python中大部分都要用到多進程函數

基於python的模塊多且廣的優點,在多進程方面就有了multiprocessing這個模式進行支持學習

這個模塊提供的功能衆多:支持子進程等等,提供了Process,Queue,Pipe和Lock等組件spa

可是!這裏須要強調一個問題就是:線程

與線程不一樣,進程沒有任何共享狀態,進程修改的數據,改動僅限於該進程內


Process類

class Process(object):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
        self.name = ''
        self.daemon = False
        self.authkey = None
        self.exitcode = None
        self.ident = 0
        self.pid = 0
        self.sentinel = None

介紹一下參數:

group:參數未使用,值始終是None

target:表示調用對象,即子進程要執行的任務(就是塞進去一個你想執行的函數)

args:表示調用對象的位置參數元祖(就是對函數進行傳參)

kwargs:表示調用對象的字典(就是對函數進行傳參)

name:子進程的名字

介紹一下屬性:

p.daemon:默認值爲False,若是設爲True,表明p爲後臺運行的守護進程

​ 當p的父進程終止時,p也隨之終止,而且設定爲True後,p不能建立本身的新進程

​ 必須在p.start()以前設置 ​ p.name:進程的名稱 ​ p.pid:進程的pid

def run(self):
        pass

    def start(self):
        pass

    def terminate(self):
        pass

    def join(self, timeout=None):
        pass

    def is_alive(self):
        return False

接下來介紹一下方法:

p.start():啓動進程,並調用該子進程中的p.run()

p.run():進程啓動時運行的方法,正是它去調用target指定的函數,咱們自定義類的類中必定要實現該方法

p.terminate():強制終止進程p,不會進行任何清理操做,若是p建立了子進程,該子進程就成了殭屍進程,使用該方 法須要特別當心這種狀況。若是p還保存了一個鎖那麼也將不會被釋放,進而致使死鎖

p.is_alive():若是p仍然運行,返回True

p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)

​ timeout是可選的超時時間


Process的使用

首先很重要的一點就是,在windows系統,進程的開啓必須放到if name == 'main':的下面

第一種方法

from multiprocessing import Process


def func(name, *args, **kwargs):
    print(f'{name}執行!')
    pass


if __name__ == '__main__':
    p = Process(target=func, args=('子進程',))
    p.start()
    print('我是主進程... ...')

在主進程中建立一個子進程,用來執行函數func,並對函數進行傳參

而後利用start進行聲明子進程

第二種方法

from multiprocessing import Process


class Myprocess(Process):
    """這是Myprocess"""

    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f'{self.name}執行!')


if __name__ == '__main__':
    p = Myprocess('子進程')
    p.start()
    print('我是主進程... ...')

這種方法用的太少了,就看一下了解一下就行

更多的仍是第一種方法的使用


<center>*****</center> <center>*****</center>

相關文章
相關標籤/搜索