導航:首頁 > 編程語言 > python並行運算

python並行運算

發布時間:2023-03-29 01:36:21

python多線程並行計算通過向線程池ThreadPoolExecutor提交任務的實現方法

Python的線程池可以有效地控制系統中並發線程的數量。
當程序中需要創建許多生存期較短的線程執行運算任務時,首先考慮使用線程池。線程池任務啟動時會創建出最大線程數參數 max_workers 指定數量的空閑線程,程序只要將執行函數提交給線程池,線程池就會啟動一個空閑的線程來執行它。當該函數執行結束後,該線程並不會死亡,而是再次返回到線程池中變成空閑狀態,等待執行下一個函數。配合使用 with 關鍵字實現任務隊列完成後自動關閉線程池釋放資源。

⑵ Python的多進程模塊multiprocessing

眾所周知,Python中不存在真正的多線程,Python中的多線程是一個並發過程。如果想要並行的執行程序,充分的利用cpu資源(cpu核心),還是需要使用多進程解決的。其中multiprocessing模塊應該是Python中最常用的多進程模塊了。

基本上multiprocessing這個模塊和threading這個模塊用法是相同的,也是可以通過函數和類創建進程。

上述案例基本上就是筆者搬用了上篇文章多線程的案例,可見其使用的相似之處。導入multiprocessing後實例化Process就可以創建一個進程,參數的話也是和多線程一樣,target放置進程執行函數,args存放該函數的參數。

使用類來創建進程也是需要先繼承multiprocessing.Process並且實現其init方法。

Pool可以提供指定數量的進程,供用戶調用,當有新的請求提交到pool中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求。

但如果池中的進程數已經達到規定最大值,那麼該請求就會等待,直到池中有進程結束,才會創建新的進程。

需要注意的是,在調用join方法阻塞進程前,需要先調用close方法,,否則程序會出錯。

在上述案例中,提到了非阻塞,當把創建進程的方法換為pool.apply(func, (msg,))時,就會阻塞進程,出現下面的狀況。

在multiprocessing模塊中還存在Queue對象,這是一個進程的安全隊列,近似queue.Queue。隊列一般也是需要配合多線程或者多進程使用。

下列案例是一個使用進程隊列實現的生產者消費者模式。

multiprocessing支持兩種進程間的通信,其中一種便是上述案例的隊列,另一種則稱作管道。在官方文檔的描述中,multiprocessing中的隊列是基於管道實現的,並且擁有更高的讀寫效率。

管道可以理解為進程間的通道,使用Pipe([plex])創建,並返回一個元組(conn1,conn2)。如果plex被置為True(默認值),那麼該管道是雙向的,如果plex被置為False,那麼該管道是單向的,即conn1隻能用於接收消息,而conn2僅能用於發送消息。

其中conn1、conn2表示管道兩端的連接對象,每個連接對象都有send()和recv()方法。send和recv方法分別是發送和接受消息的方法。例如,可以調用conn1.send發送消息,conn1.recv接收消息。如果沒有消息可接收,recv方法會一直阻塞。如果管道已經被關閉,那麼recv方法會拋出EOFError。

關於multiprocessing模塊其實還有很多實用的類和方法,由於篇幅有限(懶),筆者就先寫到這里。該模塊其實用起來很像threading模塊,像鎖對象和守護線程(進程)等multiprocessing模塊也是有的,使用方法也近乎相同。

如果想要更加詳細的了解multiprocessing模塊,請參考官方文檔。

⑶ 要用python從幾百萬行數據的文件一行行讀數據並計算,如何處理最快,哪位大牛可以指點一下

如果你的數據互相有關系的話,你就只能用readline一行完了之後再處理一行;
如果你的數據是每行不相乾的,那你應該可以把文件分成幾段,每段分配一個thread處理;
如果你的數據時每行不相干,而且你對數據的操作不很復雜的話,應該可以考慮用gpu來代替cpu並行處理。

⑷ python 多線程為什麼沒有並行

1. GIL是什麼?
  GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是python設計之初的考慮,為了數據安全所做的決定。
2. 每個CPU在同一時間只能執行一個線程
  在單核CPU下的多線程其實都只是並發,不是並行,並發和並行從宏觀上來講都是同時處理多路請求的概念。但並發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而並發是指兩個或多個事件在同一時間間隔內發生。

⑸ python腳本運行計算軟體,並把結果讀取出來

importre
importos
importthreading
importshutil

defget_file_list(folder):
file_list=[];
forroot,dirs,filesinos.walk(folder):
forfinfiles:
path=root+os.path.sep+f
file_list.append(path)
returnfile_list

defget_re_file_list(file_list,re_rule):
file_list_re=[]
forfile_pathinfile_list:
ifre.search(re_rule,file_path):
file_list_re.append(file_path)
returnfile_list_re

defsearch(root,re_rule):
','
returnget_refile_list(get_file_list(root),re_rule)

defwrite2file(a_list,file_path):
f=open(file_path,'a',encoding='utf-8')
forlineina_list:
f.write(line+' ')
f.close()

defwrite1line2file(line,file_path):
f=open(file_path,'a',encoding='utf-8')
f.write(line+' ')
f.close()


defread2memory(file_path):
withopen(file_path,'r',encoding='utf8')asf:
returnf.read().split(' ')

defcp(source,target):
ifnotos.path.exists(os.path.dirname(target)):
os.makedirs(os.path.dirname(target))
shutil.(source,target)

defgrep_five(pdb_file,rec_list,lig_list):
pdb=pdb_file
target="./dock_result/"+os.path.dirname(pdb).split('/')[-1]+'.pdb'
cp(pdb,target)
fr=read2memory(pbd)
forlineinfr:
five=int(line.split('')[4])
if1<=five<=486:
rec_list.append(line)
eliffive==487:
lig_list.append(line)defmain():
ligand_root=r"./ligand"

#step1
ligand_filelist=search(ligand_root,".mol2$")
write2file(ligand_filelist,"ligand.txt")
#step2
#move*.mol2topbsa_all,rename2lig.mol2
#movescreen_pbsa/*topbsa_all
screen_pbsa_filelist=get_file_list("./screen_pbsa")
forfinligand_filelist:
target_dir="./"+"pbsa_all"+"/"+os.path.basename(f)[:-5]
target_path=target_dir+"/"+"lig.mol2"
cp(f,target_path)
forspfinscreen_pbsa_filelist:
target_path=target_dir+"/"+os.path.basename(spf)
cp(spf,target_path)
#step3A
os.system("./mmpbsa1.sh")
pdb_filelist=search("./pbsa_all",".pdb$")
rec_list=[]
lig_list=[]
forpdbinpdb_filelist:
threads.append(threading.Thread(target=grep_five,args=(pdb,rec_list,lig_list)))
fortinthreads:
t.setDaemon(True)
t.start()
t.join()
#step3B
write2file(rec_list,"rec.pdb")
write2file(lig_list,"lig1.pdb")
#step4
os.system("./mmpbsa2")
total_result_list=read2memory("total_result.out")[1]
gas=total_result_list.split("")[1]
pbtot=total_result_list.split("")[2]
gbtot=total_result_list.split("")[3]
write1line2file("GAS"+gas+"2.67")
write1line2file("PBTOT"+pbtot+"2.89")
write1line2file("GBTOT"+gbtot+"2.30")

if__name__=='__main__':
main()

⑹ python能實現並行嗎

Python可以實現並行,Python可以用多進程來實現並行。

進程與線程的定義:

進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

進程與線程的聯系:

一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.

相對進程而言,線程是一個更加接近於執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。

更多Python知識,請關註:Python自學網!!

閱讀全文

與python並行運算相關的資料

熱點內容
中文字幕在線觀看網站網址 瀏覽:183
獸人電影有多少部 瀏覽:514
女同超人 瀏覽:923
電影大象生殖器 瀏覽:741
英語視聽說伺服器地址輸錯了怎麼辦 瀏覽:108
重生楊過收穆念慈,洗澡 瀏覽:836
工商總局app在哪裡下載 瀏覽:246
免費成人影院網站是多少 瀏覽:156
hp伺服器閃紅燈什麼意思 瀏覽:244
php加入購物車代碼 瀏覽:921
奇跡男孩電影完整版免費播放 瀏覽:663
羅曼史生孩子在那一段在幾分鍾 瀏覽:953
成龍40部經典電影 瀏覽:795
程序員連出兩次線上事故 瀏覽:427
啄木鳥電影什麼意思 瀏覽:292
主角叫柱子的鄉村小說 瀏覽:962
肉特別多的電影 瀏覽:970
好的在觀看網站 瀏覽:307
vip免費影視劇網站 瀏覽:924
恐怖鬼片免費版在線觀看 瀏覽:539