python 的多程序程式設計

2021-08-02 06:16:56 字數 4299 閱讀 2952

python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。python提供了非常好用的多程序包multiprocessing,只需要定義乙個函式,python會完成其他所有事情。借助這個包,可以輕鬆完成從單程序到

併發執行

的轉換。multiprocessing支援子程序、通訊和共享資料、執行不同形式的同步,提供了process、queue、pipe、lock等元件。

乙個最簡單的多程序例子。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

from multiprocessing import pool

from time import sleep

def func(x):

sleep(1)

return x*x

if __name__ == '__main__':

p = pool(5)

print p.map(func,[1,2,3,4,5])

這個例子的內容是計算1,2,3,4,5的平方,但是呼叫了多程序,一共五個程序。每個程序分別取計算平方。

再看另一種多程序的實現方法。

#!/usr/bin/env python

from multiprocessing import process

import os

def info(title):

print title

print 'moudle name:',__name__

if hasattr(os,'getppid'):

print 'parent process',os.getppid()

print 'process id:',os.getpid()

def func(name):

info('function func')

print 'hello',name

if __name__ == '__main__':

info('function main')

print '------------------'

p = process(target=func,args=('jack',))

p.start()

p.join()

看看執行的結果。

function main

moudle name: __main__

parent process 4298

process id: 6323

------------------

function func

moudle name: __main__

parent process 6323

process id: 6324

hello jack

內容是,建立了乙個程序去執行了乙個function func 函式。可以清楚看到,父子程序之間的關係。

多程序之間的通訊

首先程序之間預設是不能共享資料的,而執行緒是可以的。

#!/usr/bin/env python

from multiprocessing import process

import threading

def run(info_list,n):

print info_list

info =

print '------- process ----------'

for i in range(10):

p = process(target=run,args=[info,i])

p.start()

p.join()

print '------- threading --------'

info =

for i in range(10):

t = threading.thread(target=run,args=[info,i])

t.start()

t.join()

結果是:

------- process ----------

[0][1]

[2][3]

[4][5]

[6][7]

[8][9]

------- threading --------

[0][0, 1]

[0, 1, 2]

[0, 1, 2, 3]

[0, 1, 2, 3, 4]

[0, 1, 2, 3, 4, 5]

[0, 1, 2, 3, 4, 5, 6]

[0, 1, 2, 3, 4, 5, 6, 7]

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

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

由此可見,程序之間是不共享資料的。而執行緒是可以的。

將所有程序產生的資料都放進queue裡面。這樣的話,x程序可以去使用y程序產生的資料。

#!/usr/bin/python

from multiprocessing import process,queue

def func(q,n):

q.put(['index',n])

if __name__ == '__main__':

q = queue()

for i in range(5):

p = process(target=func,args=(q,i))

p.start()

while true:

print q.get()

執行結果是。可以完全的取出0到4.

結果:['index', 2]

['index', 4]

['index', 0]

['index', 1]

['index', 3]

第二,通過pipe進行多程序間通訊。

pipe物件返回的元組分別代表的是管道的兩端,管道預設的是全雙工。兩端都支援send和recv方法。兩個程序分別操作管道兩端的時候不會有衝突,兩個程序對管道一端同時讀寫可能會有衝突:

如果定義了p = pipe(duplex=false)的單向管道,則p[0]只負責接受訊息,p[1]只負責傳送訊息。

from multiprocessing import pipe, process

def func(p):

p.send([1, 'str', none])

p.close()

if __name__ == "__main__":

parent_side, child_side = pipe()

p = process(target=func, args=(child_side,))

p.start()

print parent_side.recv()

p.join()

第三,防止訪問衝突。

通過加鎖的方式可以對乙個資源實現獨享。

from multiprocessing import lock, process

def lock_func(l, number):

l.acquire()

print "number is: %d" % number

l.release()

if __name__ == "__main__":

l = lock()

for number in range(10):

process(target=lock_func, args=(l, number,)).start()

一開始的時候就使用執行緒池,操作十分簡便。

from multiprocessing import pool

import time

def f(x):

print x*x

time.sleep(1)

return x*x

pool = pool(processes=4)

res_list =

for i in range(10):

res.get(timeout=2)

python多程序 Python多程序程式設計詳解

本文 在 python 3.6 環境下測試通過。多程序 multiprocessing 模組是在 python 2.6 版本中加入的,和多執行緒 threading 模組類似,都是用來做並行運算的。不過python既然有了threading,為什麼還要搞乙個multiprocessing呢?這是因為...

python 多程序程式設計

多程序指的是乙個程式可以啟動多個程序執行,一般模式如下 import multiprocessing from multiprocessing import process,current process import time cup 核數量 num cpus multiprocessing.cp...

python多程序程式設計

python多程序程式設計。最近開始學習python程式語言,詳細參照 python絕技運用python成為頂級黑客 在學習過程第一章節中,編寫破解linux shadow檔案時,想利用多執行緒加快破解速度。主機執行環境為windows下的vm workstation上的一台虛擬機器,執行多執行緒 ...