日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

8-python自动化-day08-进程、线程、协程篇

發(fā)布時(shí)間:2023/11/30 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8-python自动化-day08-进程、线程、协程篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)內(nèi)容

  • 主機(jī)管理之paramiko模塊學(xué)習(xí)?

  • 進(jìn)程、與線程區(qū)別
  • python GIL全局解釋器鎖
  • 線程
  • 語(yǔ)法
  • join
  • 線程鎖之Lock\Rlock\信號(hào)量
  • 將線程變?yōu)槭刈o(hù)進(jìn)程
  • Event事件 
  • queue隊(duì)列
  • 生產(chǎn)者消費(fèi)者模型
  • Queue隊(duì)列
  • 開發(fā)一個(gè)線程池
  • 進(jìn)程
  • 語(yǔ)法
  • 進(jìn)程間通訊
  • 進(jìn)程池 
  • 轉(zhuǎn)載:  http://www.cnblogs.com/alex3714/articles/5230609.html 

    paramiko模塊學(xué)習(xí)

    SSHClient,用于連接遠(yuǎn)程服務(wù)器并執(zhí)行基本命令

    基于用戶名密碼連接:

    1 import paramiko 2 3 # 創(chuàng)建SSH對(duì)象 4 ssh = paramiko.SSHClient() 5 # 允許連接不在know_hosts文件中的主機(jī) 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 連接服務(wù)器 8 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123') 9 10 # 執(zhí)行命令 11 stdin, stdout, stderr = ssh.exec_command('df') 12 # 獲取命令結(jié)果 13 result = stdout.read() 14 15 # 關(guān)閉連接 16 ssh.close() import paramikotransport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123')ssh = paramiko.SSHClient() ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df') print stdout.read()transport.close() SSHClient 封裝 Transport

    基于公鑰密鑰連接:

    1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') 4 5 # 創(chuàng)建SSH對(duì)象 6 ssh = paramiko.SSHClient() 7 # 允許連接不在know_hosts文件中的主機(jī) 8 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 9 # 連接服務(wù)器 10 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key) 11 12 # 執(zhí)行命令 13 stdin, stdout, stderr = ssh.exec_command('df') 14 # 獲取命令結(jié)果 15 result = stdout.read() 16 17 # 關(guān)閉連接 18 ssh.close() import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient() ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')transport.close() 封裝Transport連接 import paramiko from io import StringIOkey_str = """-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8 NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e 7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+ c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8 S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6 01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65 lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA 539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8 RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg 9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/ pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj 98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI +MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0= -----END RSA PRIVATE KEY-----"""private_key = paramiko.RSAKey(file_obj=StringIO(key_str)) transport = paramiko.Transport(('10.0.1.40', 22)) transport.connect(username='wupeiqi', pkey=private_key)ssh = paramiko.SSHClient() ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df') result = stdout.read()transport.close()print(result) 封裝Transport私鑰

    ?

    SFTPClient

    用于連接遠(yuǎn)程服務(wù)器并執(zhí)行上傳下載

    基于用戶名密碼上傳下載

    1 import paramiko 2 3 transport = paramiko.Transport(('hostname',22)) 4 transport.connect(username='wupeiqi',password='123') 5 6 sftp = paramiko.SFTPClient.from_transport(transport) 7 # 將location.py 上傳至服務(wù)器 /tmp/test.py 8 sftp.put('/tmp/location.py', '/tmp/test.py') 9 # 將remove_path 下載到本地 local_path 10 sftp.get('remove_path', 'local_path') 11 12 transport.close()

    基于公鑰密鑰上傳下載

    1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') 4 5 transport = paramiko.Transport(('hostname', 22)) 6 transport.connect(username='wupeiqi', pkey=private_key ) 7 8 sftp = paramiko.SFTPClient.from_transport(transport) 9 # 將location.py 上傳至服務(wù)器 /tmp/test.py 10 sftp.put('/tmp/location.py', '/tmp/test.py') 11 # 將remove_path 下載到本地 local_path 12 sftp.get('remove_path', 'local_path') 13 14 transport.close()

    ?

    實(shí)例:

    #!/usr/bin/env python # -*- coding:utf-8 -*- import paramiko import uuidclass Haproxy(object):def __init__(self):self.host = '172.16.103.191'self.port = 22self.username = 'wupeiqi'self.pwd = '123'self.__k = Nonedef create_file(self):file_name = str(uuid.uuid4())with open(file_name,'w') as f:f.write('sb')return file_namedef run(self):self.connect()self.upload()self.rename()self.close()def connect(self):transport = paramiko.Transport((self.host,self.port))transport.connect(username=self.username,password=self.pwd)self.__transport = transportdef close(self):self.__transport.close()def upload(self):# 連接,上傳file_name = self.create_file()sftp = paramiko.SFTPClient.from_transport(self.__transport)# 將location.py 上傳至服務(wù)器 /tmp/test.pysftp.put(file_name, '/home/wupeiqi/tttttttttttt.py')def rename(self):ssh = paramiko.SSHClient()ssh._transport = self.__transport# 執(zhí)行命令stdin, stdout, stderr = ssh.exec_command('mv /home/wupeiqi/tttttttttttt.py /home/wupeiqi/ooooooooo.py')# 獲取命令結(jié)果result = stdout.read()ha = Haproxy() ha.run()Demo View Code

    ?

    ?

    進(jìn)程與線程

    什么是進(jìn)程(process)?

    程序并不能單獨(dú)運(yùn)行,只有將程序裝載到內(nèi)存中,系統(tǒng)為它分配資源才能運(yùn)行,而這種執(zhí)行的程序就稱之為進(jìn)程。程序和進(jìn)程的區(qū)別就在于:程序是指令的集合,它是進(jìn)程運(yùn)行的靜態(tài)描述文本;進(jìn)程是程序的一次執(zhí)行活動(dòng),屬于動(dòng)態(tài)概念。

    在多道編程中,我們?cè)试S多個(gè)程序同時(shí)加載到內(nèi)存中,在操作系統(tǒng)的調(diào)度下,可以實(shí)現(xiàn)并發(fā)地執(zhí)行。這是這樣的設(shè)計(jì),大大提高了CPU的利用率。進(jìn)程的出現(xiàn)讓每個(gè)用戶感覺到自己獨(dú)享CPU,因此,進(jìn)程就是為了在CPU上實(shí)現(xiàn)多道編程而提出的。

    有了進(jìn)程為什么還要線程?

    進(jìn)程有很多優(yōu)點(diǎn),它提供了多道編程,讓我們感覺我們每個(gè)人都擁有自己的CPU和其他資源,可以提高計(jì)算機(jī)的利用率。很多人就不理解了,既然進(jìn)程這么優(yōu)秀,為什么還要線程呢?其實(shí),仔細(xì)觀察就會(huì)發(fā)現(xiàn)進(jìn)程還是有很多缺陷的,主要體現(xiàn)在兩點(diǎn)上:

    • 進(jìn)程只能在一個(gè)時(shí)間干一件事,如果想同時(shí)干兩件事或多件事,進(jìn)程就無(wú)能為力了。

    • 進(jìn)程在執(zhí)行的過(guò)程中如果阻塞,例如等待輸入,整個(gè)進(jìn)程就會(huì)掛起,即使進(jìn)程中有些工作不依賴于輸入的數(shù)據(jù),也將無(wú)法執(zhí)行。

    ?

    例如,我們?cè)谑褂胵q聊天, qq做為一個(gè)獨(dú)立進(jìn)程如果同一時(shí)間只能干一件事,那他如何實(shí)現(xiàn)在同一時(shí)刻 即能監(jiān)聽鍵盤輸入、又能監(jiān)聽其它人給你發(fā)的消息、同時(shí)還能把別人發(fā)的消息顯示在屏幕上呢?你會(huì)說(shuō),操作系統(tǒng)不是有分時(shí)么?但我的親,分時(shí)是指在不同進(jìn)程間的分時(shí)呀, 即操作系統(tǒng)處理一會(huì)你的qq任務(wù),又切換到word文檔任務(wù)上了,每個(gè)cpu時(shí)間片分給你的qq程序時(shí),你的qq還是只能同時(shí)干一件事呀。

    再直白一點(diǎn), 一個(gè)操作系統(tǒng)就像是一個(gè)工廠,工廠里面有很多個(gè)生產(chǎn)車間,不同的車間生產(chǎn)不同的產(chǎn)品,每個(gè)車間就相當(dāng)于一個(gè)進(jìn)程,且你的工廠又窮,供電不足,同一時(shí)間只能給一個(gè)車間供電,為了能讓所有車間都能同時(shí)生產(chǎn),你的工廠的電工只能給不同的車間分時(shí)供電,但是輪到你的qq車間時(shí),發(fā)現(xiàn)只有一個(gè)干活的工人,結(jié)果生產(chǎn)效率極低,為了解決這個(gè)問(wèn)題,應(yīng)該怎么辦呢?。。。。沒錯(cuò),你肯定想到了,就是多加幾個(gè)工人,讓幾個(gè)人工人并行工作,這每個(gè)工人,就是線程!

    ?

    什么是線程(thread)?

    線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)

    ?

    總結(jié):

    進(jìn)程: qq 要以一個(gè)整體的形式暴露給操作系統(tǒng)管理,里面包含對(duì)各種資源的調(diào)用,內(nèi)存的管理,網(wǎng)絡(luò)接口的調(diào)用等。。。
    對(duì)各種資源管理的集合 就可以成為 進(jìn)程

    線程: 是操作系統(tǒng)最小的調(diào)度單位, 是一串指令的集合

    ?

    進(jìn)程與線程的區(qū)別?

    1-線程共享內(nèi)存空間,進(jìn)程的內(nèi)存是獨(dú)立的

    2-同一個(gè)進(jìn)程的線程之間可以直接交流,兩個(gè)進(jìn)程想通信,必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn)

    3-創(chuàng)建新線程很簡(jiǎn)單, 創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆

    4-一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程,但是進(jìn)程只能操作子進(jìn)程

    ?

    Python threading模塊

    1-線程的調(diào)用

    2-join:等待運(yùn)行結(jié)束

     setDaemon:守護(hù)進(jìn)程

    3-線程鎖(互斥鎖Mutex)

    4-Semaphore(信號(hào)量):允許最大允許線程數(shù)

    5-Events

    事件是一個(gè)簡(jiǎn)單的同步對(duì)象;

    該事件表示一個(gè)內(nèi)部標(biāo)志和線程
    可以等待標(biāo)志設(shè)置,或設(shè)置或清除標(biāo)志本身。

    event = threading.Event()

    #客戶端線程可以等待標(biāo)志被設(shè)置
    event.wait()

    一個(gè)服務(wù)器線程可以設(shè)置或重置它
    event.set()
    event.clear()
    如果設(shè)置了該標(biāo)志,則wait方法不會(huì)執(zhí)行任何操作。
    如果標(biāo)志被清除,等待將阻塞,直到它再次設(shè)置。
    任何數(shù)量的線程可能會(huì)等待相同的事件。

    通過(guò)Event來(lái)實(shí)現(xiàn)兩個(gè)或多個(gè)線程間的交互,下面是一個(gè)紅綠燈的例子,即起動(dòng)一個(gè)線程做交通指揮燈,生成幾個(gè)線程做車輛,車輛行駛按紅燈停,綠燈行的規(guī)則。

    1 import threading,time 2 import random 3 def light(): 4 if not event.isSet(): 5 event.set() #wait就不阻塞 #綠燈狀態(tài) 6 count = 0 7 while True: 8 if count < 10: 9 print('\033[42;1m--green light on---\033[0m') 10 elif count <13: 11 print('\033[43;1m--yellow light on---\033[0m') 12 elif count <20: 13 if event.isSet(): 14 event.clear() 15 print('\033[41;1m--red light on---\033[0m') 16 else: 17 count = 0 18 event.set() #打開綠燈 19 time.sleep(1) 20 count +=1 21 def car(n): 22 while 1: 23 time.sleep(random.randrange(10)) 24 if event.isSet(): #綠燈 25 print("car [%s] is running.." % n) 26 else: 27 print("car [%s] is waiting for the red light.." %n) 28 if __name__ == '__main__': 29 event = threading.Event() 30 Light = threading.Thread(target=light) 31 Light.start() 32 for i in range(3): 33 t = threading.Thread(target=car,args=(i,)) 34 t.start()

    ?

    queue隊(duì)列?

    作用:

    1-解耦,使程序直接實(shí)現(xiàn)松耦合

    2-提高處理效率

    class?queue.Queue(maxsize=0) #先入先出

    class?queue.LifoQueue(maxsize=0) #last in fisrt out?class?queue.PriorityQueue(maxsize=0) #存儲(chǔ)數(shù)據(jù)時(shí)可設(shè)置優(yōu)先級(jí)的隊(duì)列 1 import queue 2 3 q = queue.PriorityQueue() 4 5 q.put((-1,"A")) 6 q.put((3,"B")) 7 q.put((10,"C")) 8 q.put((6,"A1")) 9 10 print(q.get()) 11 print(q.get()) 12 print(q.get()) 13 print(q.get()) View Code

    ?

    生產(chǎn)者消費(fèi)者模型

    在并發(fā)編程中使用生產(chǎn)者和消費(fèi)者模式能夠解決絕大多數(shù)并發(fā)問(wèn)題。該模式通過(guò)平衡生產(chǎn)線程和消費(fèi)線程的工作能力來(lái)提高程序的整體處理數(shù)據(jù)的速度。

    為什么要使用生產(chǎn)者和消費(fèi)者模式

    在線程世界里,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的線程,消費(fèi)者就是消費(fèi)數(shù)據(jù)的線程。在多線程開發(fā)當(dāng)中,如果生產(chǎn)者處理速度很快,而消費(fèi)者處理速度很慢,那么生產(chǎn)者就必須等待消費(fèi)者處理完,才能繼續(xù)生產(chǎn)數(shù)據(jù)。同樣的道理,如果消費(fèi)者的處理能力大于生產(chǎn)者,那么消費(fèi)者就必須等待生產(chǎn)者。為了解決這個(gè)問(wèn)題于是引入了生產(chǎn)者和消費(fèi)者模式。

    什么是生產(chǎn)者消費(fèi)者模式

    生產(chǎn)者消費(fèi)者模式是通過(guò)一個(gè)容器來(lái)解決生產(chǎn)者和消費(fèi)者的強(qiáng)耦合問(wèn)題。生產(chǎn)者和消費(fèi)者彼此之間不直接通訊,而通過(guò)阻塞隊(duì)列來(lái)進(jìn)行通訊,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費(fèi)者處理,直接扔給阻塞隊(duì)列,消費(fèi)者不找生產(chǎn)者要數(shù)據(jù),而是直接從阻塞隊(duì)列里取,阻塞隊(duì)列就相當(dāng)于一個(gè)緩沖區(qū),平衡了生產(chǎn)者和消費(fèi)者的處理能力。

    ?

    下面來(lái)學(xué)習(xí)一個(gè)最基本的生產(chǎn)者消費(fèi)者模型的例子

    1 import threading,time 2 3 import queue 4 5 q = queue.Queue(maxsize=10) 6 7 def Producer(name): 8 count = 1 9 while True: 10 q.put("骨頭%s" % count) 11 print("生產(chǎn)了骨頭",count) 12 count +=1 13 time.sleep(0.1) 14 15 16 17 def Consumer(name): 18 #while q.qsize()>0: 19 while True: 20 print("[%s] 取到[%s] 并且吃了它..." %(name, q.get())) 21 time.sleep(1) 22 23 24 25 p = threading.Thread(target=Producer,args=("A1",)) 26 c = threading.Thread(target=Consumer,args=("q1",)) 27 c1 = threading.Thread(target=Consumer,args=("q2",)) 28 29 30 p.start() 31 c.start() 32 c1.start() View Code

    ?

    1 import time,random 2 import queue,threading 3 q = queue.Queue()#線程的queue,實(shí)例化 4 def Producer(name): 5 count = 0 6 while count <20: 7 time.sleep(random.randrange(3)) 8 q.put(count) 9 print('Producer %s has produced %s baozi..' %(name, count)) 10 count +=1 11 def Consumer(name): 12 count = 0 13 while count <20: 14 time.sleep(random.randrange(4)) 15 if not q.empty(): 16 data = q.get() 17 print(data) 18 print('\033[32;1mConsumer %s has eat %s baozi...\033[0m' %(name, data)) 19 else: 20 print("-----no baozi anymore----") 21 count +=1 22 p1 = threading.Thread(target=Producer, args=('A',)) 23 c1 = threading.Thread(target=Consumer, args=('B',)) 24 p1.start() 25 c1.start()

    ?

    多進(jìn)程multiprocessing

    多進(jìn)程是一個(gè)使用類似于線程模塊的API來(lái)支持產(chǎn)卵過(guò)程的包。 多處理包提供本地和遠(yuǎn)程并發(fā),通過(guò)使用子進(jìn)程而不是線程來(lái)有效地側(cè)移全局解釋器鎖。 因此,多處理模塊允許程序員充分利用給定機(jī)器上的多個(gè)處理器。

    進(jìn)程間通訊  

    不同進(jìn)程間內(nèi)存是不共享的,要想實(shí)現(xiàn)兩個(gè)進(jìn)程間的數(shù)據(jù)交換,可以用以下方法:

    Queues

    使用方法跟threading里的queue差不多

    1 from multiprocessing import Process, Queue 2 3 def f(q): 4 q.put([42, None, 'hello']) 5 6 if __name__ == '__main__': 7 q = Queue() 8 p = Process(target=f, args=(q,)) 9 p.start() 10 print(q.get()) # prints "[42, None, 'hello']" 11 p.join()

    ?

    進(jìn)程數(shù)據(jù)共享

    進(jìn)程各自持有一份數(shù)據(jù),默認(rèn)無(wú)法共享數(shù)據(jù)

    1 from multiprocessing import Process, Manager 2 3 def f(d, l): 4 d[1] = '1' 5 d['2']=2 6 d[3]=None 7 l.append(1) 8 print(l) 9 10 11 if __name__ == '__main__': 12 with Manager() as manager: 13 d = manager.dict() 14 15 l = manager.list(range(5)) 16 p_list = [] 17 for i in range(3): 18 p = Process(target=f, args=(d, l)) 19 p.start() 20 p_list.append(p) 21 for res in p_list: 22 res.join() 23 print(d)#{1: '1', 3: None, '2': 2} 24 print(l)#[0, 1, 2, 3, 4, 1, 1, 1]

    進(jìn)程同步-進(jìn)程鎖

    當(dāng)創(chuàng)建進(jìn)程時(shí)(非使用時(shí)),共享數(shù)據(jù)會(huì)被拿到子進(jìn)程中,當(dāng)進(jìn)程中執(zhí)行完畢后,再賦值給原值。

    1 from multiprocessing import Process, Lock 2 3 4 def f(l, i): 5 l.acquire() 6 print('hello world', i) 7 l.release() 8 9 10 if __name__ == '__main__': 11 lock = Lock() 12 13 for num in range(100): 14 Process(target=f, args=(lock, num)).start() 進(jìn)程鎖

    ?

    進(jìn)程池  

    進(jìn)程池內(nèi)部維護(hù)一個(gè)進(jìn)程序列,當(dāng)使用時(shí),則去進(jìn)程池中獲取一個(gè)進(jìn)程,如果進(jìn)程池序列中沒有可供使用的進(jìn)進(jìn)程,那么程序就會(huì)等待,直到進(jìn)程池中有可用進(jìn)程為止。

    進(jìn)程池中有兩個(gè)方法:

    • apply
    • apply_async
    1 from multiprocessing import Process, Pool,freeze_support 2 import time 3 import os 4 5 def Foo(i): 6 time.sleep(2) 7 print("in process",os.getpid()) 8 return i + 100 9 10 def Bar(arg): 11 print('-->exec done:', arg,os.getpid()) 12 13 if __name__ == '__main__': 14 #freeze_support()#windows下的要加 15 pool = Pool(processes=3) #允許進(jìn)程池同時(shí)放入3個(gè)進(jìn)程 16 print("主進(jìn)程",os.getpid()) 17 for i in range(7): 18 pool.apply_async(func=Foo, args=(i,), callback=Bar) #callback回調(diào),調(diào)用bar方法 19 #pool.apply(func=Foo, args=(i,)) #串行 20 #pool.apply_async(func=Foo, args=(i,)) #串行,非阻塞時(shí)運(yùn)行 21 print('end') 22 pool.close()#一定要加上 23 pool.join() #進(jìn)程池中進(jìn)程執(zhí)行完畢后再關(guān)閉,如果注釋,那么程序直接關(guān)閉。.join() View Code

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/liguanqiu/p/6734143.html

    總結(jié)

    以上是生活随笔為你收集整理的8-python自动化-day08-进程、线程、协程篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。