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上的一台虛擬機器,執行多執行緒 ...