導航:首頁 > 編程語言 > python多進程log

python多進程log

發布時間:2024-09-05 13:24:38

『壹』 python 多線程logger問題

因為logging是threadsafe的,但不是process-safe(應該沒有這個詞兒,只是為了便於理解)的。這段代碼就是多個進程共同操作一個日誌文件。這種情況下,logging的行為就很難說了。


我測試了一下,日誌中大概幾百行。而且,可以看到一些順序錯亂現象:

Fri, 08 Aug 2014 01:19:38 logging_in_multithread.py[line:40] theadWorking ERROR 2
FFri, 08 Aug 2014 01:19:36 logging_in_multithread.py[line:40] theadWorking ERROR 11(注意這里的FFri)


把代碼這樣改:

fornuminrange(processNum):
p=Process(target=processWorking,args=('2',))
processs.append(p)
p.start()
p.join()

還有其他方法,比如:為logging實現一個FileHandler,以使logging在multiple process的環境下也能正常工作。這是我從網上了解到的做法,自己還沒實踐過。


Python Manual中logging Cookbook中有這么一段話:

Logging to a single file from multiple processes

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.)

這段話中也提出了另外一種解決方案。

『貳』 Python3多進程運行返回值怎麼獲得

frommultiprocessingimportPool
importtime
defwork(n):
print('開工啦...')
time.sleep(3)
returnn**2

if__name__=='__main__':
q=Pool()

#非同步apply_async用法:如果使用非同步提交的任務,主進程需要使用jion,等待進程池內任務都處理完,然後可以用get收集結果,否則,主進程結束,進程池可能還沒來得及執行,也就跟著一起結束了
res=q.apply_async(work,args=(2,))
q.close()
q.join()#join在close之後調用
print(res.get())

#同步apply用法:主進程一直等apply提交的任務結束後才繼續執行後續代碼
#res=q.apply(work,args=(2,))
#print(res)

『叄』 python並發編程之多進程方式(multiprocessing模塊)

Python的並發編程提供了多進程方式來提高效率,通過multiprocessing模塊實現。下面將詳細闡述進程與線程的區別,以及如何使用多進程來優化任務執行。

在並發編程中,進程就像工廠的車間,每個車間運行一個獨立的線程,即工人。為了提升生產效率,我們需要理解進程和線程的協作與獨立性。

首先,我們通過串列執行程序,將兩個數值傳遞給func函數,逐個處理。這展示了單進程的工作方式,隨後引入多進程。Python的multiprocessing模塊允許我們創建多個並行運行的進程。通過Process類,我們創建子進程,它們獨立於主進程,沒有執行順序,如下面的代碼所示:

python
import multiprocessing as mp
# 創建子進程
p1 = mp.Process(target=func, args=(數值1,))
p2 = mp.Process(target=func, args=(數值2,))

主進程在子進程啟動後繼續執行,由於子進程各自獨立輪詢,主進程完成的時間會早於子進程。當子進程輪詢序列相同時,它們會同時完成,如代碼中所述:

python
# 使用join方法等待子進程結束
p1.start()
p2.start()
p1.join()
p2.join()

在實際應用中,尤其是需要處理大量數據或任務的場景,我們可以使用循環來創建多個子進程,以進一步提高效率。通過多進程方式,Python為我們提供了一種高效且靈活的並發解決方案。

『肆』 python最多多少進程(linux最多多少進程)

導讀:今天首席CTO筆記來給各位分享關於python最多多少進程的相關內容,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!

python進程池最大數量

初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那麼就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那麼該請求就會等待,直到池中有進程結束,才會用之前的進程來執行新的任務。

pythonmultiprocessing最大多少進程

最大進程只受操作系統資源限制.

不是進程越多越好,程序的速度就越快.

一般有幾個CPU核心,就開多少進程,或者核心數的N倍.

pythonprocess最多能多少個進程

由於GIL的存在,python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。

Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。藉助這個包,可以輕松完成從單進程到並發執行的轉換。

multiprocessing支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。

python多進程

基於官方文檔:

日樂購,剛才看到的一個博客,寫的都不太對,還是基於官方的比較穩妥

我就是喜歡抄官方的,哈哈

通常我們使用Process實例化一個進程,並調用他的start()方法啟動它。

這種方法和Thread是一樣的。

上圖中,我寫了p.join()所以主進程是等待子進程執行完後,才執行print("運行結束")

否則就是反過來了(這個不一定,看你的語句了,順序其實是隨機的)例如:

主進加個sleep

所以不加join(),其實子進程和主進程是各干各的,誰也不等誰。都執行完後,文件運行就結束了

上面我們用了os.getpid()和os.getppid()獲取當前進程,和父進程的id

下面就講一下,這兩個函數的用法:

os.getpid()

返回當前進程的id

os.getppid()

返回父進程的id。父進程退出後,unix返回初始化進程(1)中的一個

windows返回相同的id(可能被其他進程使用了)

這也就解釋了,為啥我上面的程序運行多次,第一次列印的parentid都是14212了。

而子進程的父級processid是調用他的那個進程的id:1940

視頻筆記:

多進程:使用大致方法:

參考:進程通信(pipe和queue)

pool.map(函數可以有return也可以共享內存或queue)結果直接是個列表

poll.apply_async()(同map,只不過是一個進程,返回結果用xx.get()獲得)

報錯:

參考:

把pool=Pool()放到ifname=="main":下面初始化搞定。

結果:

這個肯定有解釋的

測試多進程計算效果:

進程池運行:

結果:

普通計算:

我們同樣傳入1210三個參數測試:

其實對比下來開始快了一半的;

我們把循環里的數字去掉一個0;

單進程:

多進程:

兩次測試單進程/進程池分別為0.669和0.772幾乎成正比的。

問題二:

視圖:

post視圖裡面

Music類:

直接報錯:

寫在類裡面也在函數里用self.pool調用也不行,也是相同的錯誤。

最後把pool=Pool直接寫在search函數裡面,奇跡出現了:

前台也能顯示搜索的音樂結果了

總結一點,進程這個東西,最好寫在直接運行的函數裡面,而不是一個函數跳來跳去。因為最後可能是在子進程的子進程運行的,這是不許的,會報錯。

還有一點,多進程運行的函數對象,不能是lambda函數。也許lambda虛擬,在內存??

使用pool.map子進程函數報錯,導致整個pool掛了:

參考:

主要你要,對函數內部捕獲錯誤,而不能讓異常拋出就可以了。

關於map傳多個函數參數

我一開始,就是正常思維,多個參數,搞個元祖,讓參數一一對應不就行了:

報錯:

參考:

普通的process當讓可以穿多個參數,map卻不知道咋傳的。

apply_async和map一樣,不知道咋傳的。

最簡單的方法:

使用starmap而不是map

結果:

子進程結束

1.8399453163146973

成功拿到結果了

關於map和starmap不同的地方看源碼

關於apply_async(),我沒找到多參數的方法,大不了用一個迭代的starmap實現。哈哈

關於上面源碼裡面有itertools.starmap

itertools用法參考:

有個問題,多進程最好不要使用全部的cpu,因為這樣可能影響其他任務,所以在進程池添加process參數指定,cpu個數:

上面就是預留了一個cpu干其他事的

後面直接使用Queue遇到這個問題:

解決:

Manager().Queue()代替Queue()

因為queue.get()是堵塞型的,所以可以提前判斷是不是空的,以免堵塞進程。比如下面這樣:

使用queue.empty()空為True

結語:以上就是首席CTO筆記為大家介紹的關於python最多多少進程的全部內容了,希望對大家有所幫助,如果你還想了解更多這方面的信息,記得收藏關注本站。

閱讀全文

與python多進程log相關的資料

熱點內容
平板電腦加密失敗後玩不了 瀏覽:710
狂人c程序員入門必備 瀏覽:705
台灣伺服器域名是什麼雲空間 瀏覽:901
單片機程序電子版 瀏覽:599
路由器加密模式只有wpa2 瀏覽:530
ug刪除加密 瀏覽:433
安卓手機如何下載最低版本的抖音 瀏覽:778
sprint演算法 瀏覽:445
數控編程學習資料 瀏覽:177
pdf語文 瀏覽:943
單片機小學比賽 瀏覽:95
條件預編譯多條件 瀏覽:394
物理學好可以當程序員嗎 瀏覽:435
jsp圖片網站源碼 瀏覽:845
美股開盤加密貨幣大跌 瀏覽:18
ubuntuphp伺服器 瀏覽:189
伺服器編輯器如何寫 瀏覽:384
我有一套源碼自帶採集 瀏覽:112
對稱加密演算法的特點 瀏覽:47
河池看房用什麼app 瀏覽:283