溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的進程是什么

發布時間:2020-09-24 14:11:10 來源:億速云 閱讀:163 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關Python中的進程是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

multiprocessing是python的多進程管理包,和threading.Thread類似。

1、multiprocessing模塊

直接從側面用subprocesses替換線程使用GIL的方式,由于這一點,multiprocessing模塊可以讓程序員在給定的機器上充分的利用CPU。在multiprocessing中,通過創建Process對象生成進程,然后調用它的start()方法,

from multiprocessing import Process
  
def func(name):
    print('hello', name)
if __name__ == "__main__":
    p = Process(target=func,args=('zhangyanlin',))
    p.start()
    p.join()  # 等待進程執行完畢

在使用并發設計的時候最好盡可能的避免共享數據,尤其是在使用多進程的時候。 如果你真有需要 要共享數據, multiprocessing提供了兩種方式。

(1)multiprocessing,Array,Value

數據可以用Value或Array存儲在一個共享內存地圖里,如下:

from multiprocessing import Array,Value,Process
  
def func(a,b):
    a.value = 3.333333333333333
    for i in range(len(b)):
        b[i] = -b[i]
if __name__ == "__main__":
    num = Value('d',0.0)
    arr = Array('i',range(11))
  
    c = Process(target=func,args=(num,arr))
    d= Process(target=func,args=(num,arr))
    c.start()
    d.start()
    c.join()
    d.join()
  
    print(num.value)
    for i in arr:
        print(i)

輸出

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

創建num和arr時,“d”和“i”參數由Array模塊使用的typecodes創建:“d”表示一個雙精度的浮點數,“i”表示一個有符號的整數,這些共享對象將被線程安全的處理。

Array(‘i’, range(10))中的‘i’參數:

‘c’: ctypes.c_char     ‘u’: ctypes.c_wchar    ‘b’: ctypes.c_byte     ‘B’: ctypes.c_ubyte

‘h’: ctypes.c_short     ‘H’: ctypes.c_ushort    ‘i’: ctypes.c_int      ‘I’: ctypes.c_uint

‘l’: ctypes.c_long,    ‘L’: ctypes.c_ulong    ‘f’: ctypes.c_float    ‘d’: ctypes.c_double

(2)multiprocessing,Manager

由Manager()返回的manager提供list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array類型的支持。

from multiprocessing import Process,Manager
def f(d,l):
    d["name"] = "zhangyanlin"
    d["age"] = 18
    d["Job"] = "pythoner"
    l.reverse()
  
if __name__ == "__main__":
    with Manager() as man:
        d = man.dict()
        l = man.list(range(10))
  
        p = Process(target=f,args=(d,l))
        p.start()
        p.join()
  
        print(d)
        print(l)

輸出

{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Server process manager比 shared memory 更靈活,因為它可以支持任意的對象類型。另外,一個單獨的manager可以通過進程在網絡上不同的計算機之間共享,不過他比shared memory要慢。

2、進程池(Using a pool of workers)

Pool類描述了一個工作進程池,他有幾種不同的方法讓任務卸載工作進程。

進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進進程,那么程序就會等待,直到進程池中有可用進程為止。

我們可以用Pool類創建一個進程池, 展開提交的任務給進程池。 例:

#apply
from  multiprocessing import Pool
import time
  
def f1(i):
    time.sleep(0.5)
    print(i)
    return i + 100
  
if __name__ == "__main__":
    pool = Pool(5)
    for i in range(1,31):
        pool.apply(func=f1,args=(i,))
  
#apply_async
def f1(i):
    time.sleep(0.5)
    print(i)
    return i + 100
def f2(arg):
    print(arg)
  
if __name__ == "__main__":
    pool = Pool(5)
    for i in range(1,31):
        pool.apply_async(func=f1,args=(i,),callback=f2)
    pool.close()
    pool.join()

一個進程池對象可以控制工作進程池的哪些工作可以被提交,它支持超時和回調的異步結果,有一個類似map的實現。

processes :使用的工作進程的數量,如果processes是None那么使用 os.cpu_count()返回的數量。

initializer: 如果initializer是None,那么每一個工作進程在開始的時候會調用initializer(*initargs)。

maxtasksperchild:工作進程退出之前可以完成的任務數,完成后用一個心的工作進程來替代原進程,來讓閑置的資源被釋放。maxtasksperchild默認是None,意味著只要Pool存在工作進程就會一直存活。

context: 用在制定工作進程啟動時的上下文,一般使用 multiprocessing.Pool() 或者一個context對象的Pool()方法來創建一個池,兩種方法都適當的設置了context

注意:Pool對象的方法只可以被創建pool的進程所調用。

New in version 3.2: maxtasksperchild

New in version 3.4: context

進程池的方法

apply(func[, args[, kwds]]) :使用arg和kwds參數調用func函數,結果返回前會一直阻塞,由于這個原因,apply_async()更適合并發執行,另外,func函數僅被pool中的一個進程運行。

apply_async(func[, args[, kwds[, callback[, error_callback]]]]) : apply()方法的一個變體,會返回一個結果對象。如果callback被指定,那么callback可以接收一個參數然后被調用,當結果準備好回調時會調用callback,調用失敗時,則用error_callback替換callback。 Callbacks應被立即完成,否則處理結果的線程會被阻塞。

close() : 阻止更多的任務提交到pool,待任務完成后,工作進程會退出。

terminate() : 不管任務是否完成,立即停止工作進程。在對pool對象進程垃圾回收的時候,會立即調用terminate()。

join() : wait工作線程的退出,在調用join()前,必須調用close() or terminate()。這樣是因為被終止的進程需要被父進程調用wait(join等價與wait),否則進程會成為僵尸進程。

map(func, iterable[, chunksize])?

map_async(func, iterable[, chunksize[, callback[, error_callback]]])?

imap(func, iterable[, chunksize])?

imap_unordered(func, iterable[, chunksize])

starmap(func, iterable[, chunksize])?

starmap_async(func, iterable[, chunksize[, callback[, error_back]]])。

以上就是Python中的進程是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女