《Python》進程收尾線程初識

一、數據共享

  from multiprocessing import Manager

  把所有實現了數據共享的比較便捷的類都重新又封裝了一遍,并且在原有的multiprocessing基礎上增加了新的機制list、dict

  機制:支持的數據類型非常有限

    list、dict都不是數據安全的,需要自己加鎖來保證數據安全

from multiprocessing import Manager,Process,Lockdef work(d,lock):with lock:d['count'] -= 1if __name__ == '__main__':lock = Lock()with Manager() as m:   # m = Manager()dic = m.dict({'count':100})p_lst = []for i in range(10):p = Process(target=work, args=(dic, lock))p_lst.append(p)p.start()for p in p_lst:p.join()print(dic)
#{'count': 90}
with ......一大段語句
dis模塊
python的上下文管理
在執行一大段語句之前,自動做某個操作  open
在執行一大段語句之后,自動做某個操作  close面向對象的魔術方法(雙下杠杠方法)
# 回調函數 in Poolimport os
from multiprocessing import Pooldef func(i):print('第一個任務', os.getpid())return '*'*idef call_back(res):   #回調函數print('回調函數:', os.getpid())print('res--->', res)if __name__ == '__main__':p = Pool()print('主進程', os.getpid())p.apply_async(func, args=(1,), callback=call_back)p.close()p.join()

  func執行完畢之后執行callback函數

  func的返回值會作為callback的參數

  回調函數是在主進程中實現的

  應用場景:子進程有大量運算要做,回調函數等待結果做簡單處理

import re
from urllib.request import urlopen
from multiprocessing import Poolurl_lst = ['http://www.baidu.com','http://www.sohu.com','http://www.sogou.com','http://www.4399.com','http://www.cnblogs.com',
]def get_url(url):response = urlopen(url)ret = re.search('www\.(.*?)\.com', url)print('%s finished' % ret.group(1))return ret.group(1),response.read()def call(content):url,con = contentwith open(url+'.html', 'wb')as f:f.write(con)
if __name__ == '__main__':p = Pool()for url in url_lst:p.apply_async(get_url,args=(url,),callback=call)p.close()p.join()
子進程去訪問網頁,主進程處理網頁的結果

?

二、線程理論基礎

  進程是計算機中最小的資源分配單位,進程對于操作系統來說還具有一定的負擔

  創建一個進程,操作系統分配的資源大約有:代碼,數據,文件等

1、為什么要有線程

  線程是輕量級的概念,他沒有屬于自己的進程資源,一條線程只負責執行代碼,沒有自己獨立的代碼、數據以及文件

  線程是計算機中能被CPU調用的最小的單位,當前大部分計算機中的CPU都是執行的線程中的代碼

  線程與進程之間的關系:每一個進程中都至少有一條線程在工作

線程的特點:

  同一個進程中的所有線程的資源是共享的

  輕量級, 沒有自己的資源

進程與線程之間的區別:    

  占用的資源、調度的效率、資源是否共享

線程的并行問題:

  線程可以并行:java、c++,c#等

  在cpython中,一個進程中的多個線程是不可以并行的

  原因是:Cpython解釋器內部有一把全局解釋器鎖GIL,所以線程不能充分利用多核,同一時刻同一進程中的線程只有一個能被cpu執行

  GIL鎖確實是限制了你程序的效率,但目前可以幫助你提高線程之間切換的效率

  如果是想寫高計算型的就要多進程或者換一個解釋器

2、threading 模塊

# 并發import os
from threading import Threaddef func(i):print('子線程:', i, os.getpid())print('主線程', os.getpid())
for i in range(10):t = Thread(target=func, args=(i,))t.start()
# 進程和線程的差距import os
import time
from threading import Thread
from multiprocessing import Processdef func(i):print('子:', os.getpid())if __name__ == '__main__':start = time.time()t_lst = []for i in range(100):t = Thread(target=func, args=(i,))t.start()t_lst.append(t)for t in t_lst:t.join()end = time.time()-startstart = time.time()t_lst = []for i in range(100):p = Process(target=func, args=(i,))p.start()t_lst.append(p)for p in t_lst:p.join()end2 = time.time()-startprint(end, end2)
#0.0279843807220459 13.582834720611572
# 線程間的數據共享from threading import Threadnum = 100
def func():global numnum -= 1            #每個線程都-1

t_lst = []
for i in range(100):t = Thread(target=func)   #創建一百個線程
    t.start()t_lst.append(t)
for t in t_lst:t.join()
print(num)   #0?

Thread 類的其他用法

Thread實例對象的方法# isAlive(): 返回線程是否活動的。# getName(): 返回線程名。# setName(): 設置線程名。

threading模塊提供的一些方法:# threading.currentThread(): 返回當前的線程變量。# threading.enumerate(): 返回一個包含正在運行的線程的list。正在運行指線程啟動后、結束前,不包括啟動前和終止后的線程。# threading.activeCount(): 返回正在運行的線程數量,與len(threading.enumerate())有相同的結果。
from threading import currentThread,Thread
def func():time.sleep(2)t = Thread(target=func)
t.start()
print(t.is_alive())    #True(判斷線程是否活著)
print(t.getName())  #Tread-1
t.setName('tt')
print(t.getName())   #tt(改名字)def func():print('子線程:', currentThread().ident)time.sleep(2)
print('主線程:',currentThread().ident)
t = Thread(target=func)
t.start()
#currentThread().ident返回線程的pidfrom threading import enumerate
def func():print('子進程:', currentThread().ident)time.sleep(2)print('主進程:', currentThread().ident)
for i in range(10):t = Thread(target=func)t.start()
print(len(enumerate()))
#enumerate()返回一個包含正在運行的線程的list,len(list)from threading import activeCount
def func():print('子線程:', currentThread().ident)time.sleep(2)print('主線程:', currentThread().ident)
for i in range(10):t = Thread(target=func)t.start()
print(activeCount())
#activeCount()返回正在運行的線程數量,與len(threading.enumerate())有相同的結果
示例

3、守護線程

import time
from threading import Threaddef func():while True:time.sleep(1)print(123)def func2():print('func2 start')time.sleep(3)print('func2 end')t1 = Thread(target=func)
t2 = Thread(target=func2)
t1.setDaemon(True)
t1.start()
t2.start()
print('主線程代碼結束')
# func2 start
#主線程代碼結束
#123
#123
#func2 end

?

  守護線程 是在主線程代碼結束之后,再等待子線程執行結束后才結束

  主線程結束? 就意味著主進程結束

  主線程等待所有的線程結束

  主線程結束了以后? 守護線程會隨著主進程的結束而隨之結束? 不是隨著代碼的結束而結束

??

#################################################################################

線程
線程和進程之間的關系
每個進程內都有一個線程
線程是不能獨立存在的
線程和進程之間的區別
同一個進程中線程之間的數據是共享的
進程之間的數據是隔離的
線程是被cpu執行的最小單位
操作系統調度
進程是計算機中最小的資源分配單位
python
GIL鎖 全局解釋器鎖 全局鎖
cpython解釋器中的
鎖線程 :同一時刻同一個進程只會有一個線程訪問CPU
鎖的是線程而不是數據
當程序是高IO型的 多線程
當程序是高計算(CPU)型的 多進程
cpu*1 ~ cpu*2

threading
Thread
守護線程 :主線程結束之后才結束

socket_server IO多路復用 + 多線程
框架 并發的效果 :多線程、協程的概念 flask
爬蟲 :線程池 協程

set、dict、list
生成器
面向對象的進階 :魔術方法
管道
socket_server的源碼

轉載于:https://www.cnblogs.com/yzh2857/p/9699875.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388427.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

北京修復宕機故障之旅

2012-12-18日 下午開會探討北京項目出現的一些問題,當時記錄的問題是由可能因為有一定數量的客戶上來后,就造成了Web服務器宕機,而且沒有任何時間上的規律性,讓我準備出差到北京,限定三天時間,以及準備測試…

計算機學院李世杰,有關辦理2016級轉專業學生相關手續通知

《有關辦理2016級轉專業學生相關手續通知》由會員分享,可在線閱讀,更多相關《有關辦理2016級轉專業學生相關手續通知(4頁珍藏版)》請在技術文庫上搜索。1、1 關于辦理 2016 級轉專業學生相關手續的通知 各學院(部)、各相關部門: 根據西安科技…

一般線性模型和混合線性模型_從零開始的線性混合模型

一般線性模型和混合線性模型生命科學的數學統計和機器學習 (Mathematical Statistics and Machine Learning for Life Sciences) This is the eighteenth article from the column Mathematical Statistics and Machine Learning for Life Sciences where I try to explain som…

《企業私有云建設指南》-導讀

內容簡介第1章總結性地介紹了云計算的參考架構、典型解決方案架構和涉及的關鍵技術。 第2章從需求分析入手,詳細講解了私有云的技術選型、資源管理、監控和運維。 第3章從計算、網絡、存儲資源池等方面講解了私有云的規劃和建設,以及私有云建設的總體原則…

vs2005的webbrowser控件如何接收鼠標事件

這個問題來自論壇提問,vs2005的webbrowser控件如何接收鼠標事件,很多事情其實自己動動腦子就有辦法的。主要是3步,給dom對象插入js腳本去響應鼠標-〉通過url跳轉去通知webbrowser-〉截獲跳轉事件去c#中處理 示例代碼: using System; using…

[TimLinux] Python 迭代器(iterator)和生成器(generator)

1. 可迭代對象 from collection import Iterableclass Iterable(metaclassABCMeta):...def __iter__(self): # 只實現了__iter__ 方法while False:yield None 能夠在 for ... in obj:中使用的對象(obj)就是一個可迭代對象。 2. 迭代器 from …

太原冶金技師學院計算機系,山西冶金技師學院專業都有什么

山西冶金技師學院專業大全大家在考試之后對除了選擇學校之外,還更關注專業的選擇,山西冶金技師學院有哪些專業成了大家最為關心的問題。有些同學一般是選擇好專業再選擇自己滿意的學校,下面小編將為你介紹山西冶金技師學院開設的專業及其哪些…

海南首例供港造血干細胞志愿者啟程赴廣東捐獻

海南首例供港造血干細胞志愿者啟程赴廣東捐獻。 張瑤 攝 海南首例供港造血干細胞志愿者啟程赴廣東捐獻。 張瑤 攝 中新網海口1月23日電 (張茜翼 張瑤)海南省首例供港造血干細胞捐獻者晶晶(化名)23日啟程赴廣東進行捐獻,將于28號正式捐獻采集造血干細胞,為…

如何擊敗Python的問題

Following the previous article written about solving Python dependencies, we will take a look at the quality of software. This article will cover “inspections” of software stacks and will link a free dataset available on Kaggle. Even though the title say…

KindEditor解決上傳視頻不能在手機端顯示的問題

KindEditor自帶的上傳視頻生成的HTML代碼為<embed>&#xff0c;在手機端并不支持。于是可以自己在控件里增加生成video標簽相關代碼。 參考https://www.jianshu.com/p/047198ffed92。。 然而對著修改后沒有成功&#xff0c;可能是那里沒有改對吧。依然生成的是<embed&…

湖北經濟學院的計算機是否強,graphics-ch11-真實感圖形繪制_湖北經濟學院:計算機圖形學_ppt_大學課件預覽_高等教育資訊網...

第十一章 真實感圖形技術1,簡單光照明模型2,多邊形繪制方法3,透明4,整體觀照明模型5,光線跟蹤算法第十章 真實感圖形繪制光照模型 (Illumination Model):計算某一點的光強度的模型11.1 真實感圖形的 特點? 能反映物體表面顏色和亮度的細微變化? 能表現物體表面的質感? 能通過…

ARP攻擊網絡上不去,可以進行mac地址綁定

紅色部分是需要敲的命令 Microsoft Windows [版本 6.1.7600] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\Users\dell>arp -s 顯示和修改地址解析協議(ARP)使用的“IP 到物理”地址轉換表。 ARP -s inet_addr eth_addr [if_addr] ARP -d inet_addr [if…

《獨家記憶》見面會高甜寵粉 張超現場解鎖隱藏技能

1月23日&#xff0c;由愛奇藝出品&#xff0c;小糖人聯合出品的沉浸式成長練愛劇《獨家記憶》在京舉行粉絲見面會。愛奇藝高級副總裁陳宏嘉&#xff0c;愛奇藝副總裁、自制劇開發中心總經理、《獨家記憶》總制片人戴瑩&#xff0c;小糖人董事長、《獨家記憶》總制片人朱振華&am…

計算機軟件技術基礎fifo算法,軟件技術基礎真題

一、填空1、數據結構按邏輯結構可分為兩大類&#xff0c;它們分別是線性和非線性2.1、在長為n的順序存儲的線性表中插入和刪除元素時所需移動元素的平均次數(等概率情況下)為&#xff1a;Einn/2&#xff0c;Ede(n-1)/22.2、順序表有5個元素&#xff0c;設在任何位置上插入元素是…

NOI 2016 優秀的拆分 (后綴數組+差分)

題目大意&#xff1a;給你一個字符串&#xff0c;求所有子串的所有優秀拆分總和&#xff0c;優秀的拆分被定義為一個字符串可以被拆分成4個子串&#xff0c;形如$AABB$&#xff0c;其中$AA$相同&#xff0c;$BB$相同&#xff0c;$AB$也可以相同 作為一道國賽題&#xff0c;95分…

多元線性回歸 python_Python中的多元線性回歸

多元線性回歸 pythonVideo Link影片連結 This episode expands on Implementing Simple Linear Regression In Python. We extend our simple linear regression model to include more variables.本集擴展了在Python中實現簡單線性回歸的方法 。 我們擴展了簡單的線性回歸模型…

關于apache和tomcat集群,線程是否占用實驗

測試目的&#xff1a; 測試在apache入口的時候進入&#xff0c;當Tomcat的一個請求陷入死循環&#xff0c;或者線程進入循環無反應的時候&#xff0c;是否此時占用apache的線程資源。 測試原因&#xff1a; 如果要是影響&#xff0c;無論tomcat線程設置成多大&#xff0c;都…

爬蟲之數據解析的三種方式

一&#xff0c;正則表達式解析 re正則就不寫了&#xff0c;前面已經寫入一篇很詳細的正則表達式模塊了~ 而且&#xff0c;在爬蟲中&#xff0c;下面兩種方式用的多一些~ 正則表達式&#xff1a;https://www.cnblogs.com/peng104/p/9619801.html 大致用法&#xff1a; pattern …

相對于硬件計算機軟件就是,計算機的軟件是將解決問題的方法,軟件是相對于硬件來說的...

計算機網絡管理軟件是為計算機網絡配置的系統軟件。它負責對網絡資源進行組織和管理&#xff0c;實現相互之間的通信。計算機網絡管理軟件包括網絡操作系統和數據通信處理程序。前者用于協調網絡中各計算機的操作系統及實現網絡資源的傳遞&#xff0c;后者用于網絡內的通信&…

數據冒險控制冒險_勞動生產率和其他冒險

數據冒險控制冒險Labor productivity is considered one of the most important indicators of a country’s well-being. However, we don’t know so much about it, let’s try to figure out how it is calculated, and how things are with it in the world (data source:…