欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python隊(duì)列、進(jìn)程間通信、線程案例

 更新時(shí)間:2019年10月25日 10:20:04   作者:SetCreed  
這篇文章主要介紹了Python隊(duì)列、進(jìn)程間通信、線程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

進(jìn)程互斥鎖

多進(jìn)程同時(shí)搶購余票

# 并發(fā)運(yùn)行,效率高,但競(jìng)爭(zhēng)寫同一文件,數(shù)據(jù)寫入錯(cuò)亂
# data.json文件內(nèi)容為 {"ticket_num": 1}
import json
import time
from multiprocessing import Process
def search(user):
  with open('data.json', 'r', encoding='utf-8') as f:
    dic = json.load(f)
  print(f'用戶{user}查看余票,還剩{dic.get("ticket_num")}...')
def buy(user):
  with open('data.json', 'r', encoding='utf-8') as f:
    dic = json.load(f)

  time.sleep(0.1)
  if dic['ticket_num'] > 0:
    dic['ticket_num'] -= 1
    with open('data.json', 'w', encoding='utf-8') as f:
      json.dump(dic, f)
    print(f'用戶{user}搶票成功!')

  else:
    print(f'用戶{user}搶票失敗')
def run(user):
  search(user)
  buy(user)
if __name__ == '__main__':
  for i in range(10): # 模擬10個(gè)用戶搶票
    p = Process(target=run, args=(f'用戶{i}', ))
    p.start()

使用鎖來保證數(shù)據(jù)安全

# data.json文件內(nèi)容為 {"ticket_num": 1}
import json
import time
from multiprocessing import Process, Lock
def search(user):
  with open('data.json', 'r', encoding='utf-8') as f:
    dic = json.load(f)
  print(f'用戶{user}查看余票,還剩{dic.get("ticket_num")}...')
def buy(user):
  with open('data.json', 'r', encoding='utf-8') as f:
    dic = json.load(f)

  time.sleep(0.2)
  if dic['ticket_num'] > 0:
    dic['ticket_num'] -= 1
    with open('data.json', 'w', encoding='utf-8') as f:
      json.dump(dic, f)
    print(f'用戶{user}搶票成功!')

  else:
    print(f'用戶{user}搶票失敗')
def run(user, mutex):
  search(user)
  mutex.acquire() # 加鎖
  buy(user)
  mutex.release() # 釋放鎖
if __name__ == '__main__':
  # 調(diào)用Lock()類得到一個(gè)鎖對(duì)象
  mutex = Lock()

  for i in range(10): # 模擬10個(gè)用戶搶票
    p = Process(target=run, args=(f'用戶{i}', mutex))
    p.start()

進(jìn)程互斥鎖:

讓并發(fā)變成串行,犧牲了執(zhí)行效率,保證了數(shù)據(jù)安全

在程序并發(fā)時(shí),需要修改數(shù)據(jù)使用

隊(duì)列

隊(duì)列遵循的是先進(jìn)先出

隊(duì)列:相當(dāng)于內(nèi)存中一個(gè)隊(duì)列空間,可以存放多個(gè)數(shù)據(jù),但數(shù)據(jù)的順序是由先進(jìn)去的排在前面。

q.put() 添加數(shù)據(jù)

q.get() 取數(shù)據(jù),遵循隊(duì)列先進(jìn)先出

q.get_nowait() 獲取隊(duì)列數(shù)據(jù), 隊(duì)列中沒有就會(huì)報(bào)錯(cuò)

q.put_nowait 添加數(shù)據(jù),若隊(duì)列滿了也會(huì)報(bào)錯(cuò)

q.full() 查看隊(duì)列是否滿了

q.empty() 查看隊(duì)列是否為空

from multiprocessing import Queue

# 調(diào)用隊(duì)列類,實(shí)例化隊(duì)列對(duì)象
q = Queue(5)  # 隊(duì)列中存放5個(gè)數(shù)據(jù)

# put添加數(shù)據(jù),若隊(duì)列里的數(shù)據(jù)滿了就會(huì)卡住
q.put(1)
print('進(jìn)入數(shù)據(jù)1')
q.put(2)
print('進(jìn)入數(shù)據(jù)2')
q.put(3)
print('進(jìn)入數(shù)據(jù)3')
q.put(4)
print('進(jìn)入數(shù)據(jù)4')
q.put(5)
print('進(jìn)入數(shù)據(jù)5')

# 查看隊(duì)列是否滿了
print(q.full())

# 添加數(shù)據(jù), 若隊(duì)列滿了也會(huì)報(bào)錯(cuò)
q.put_nowait(6)

# q.get() 獲取的數(shù)據(jù)遵循先進(jìn)先出
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
# print(q.get())
print(q.get_nowait())  # 獲取隊(duì)列數(shù)據(jù), 隊(duì)列中沒有就會(huì)報(bào)錯(cuò)

# 判斷隊(duì)列是否為空
print(q.empty())
q.put(6)
print('進(jìn)入數(shù)據(jù)6')

進(jìn)程間通信

IPC(Inter-Process Communication)

進(jìn)程間數(shù)據(jù)是相互隔離的,若想實(shí)現(xiàn)進(jìn)程間通信,可以利用隊(duì)列

from multiprocessing import Process, Queue
def task1(q):
  data = 'hello 你好'
  q.put(data)
  print('進(jìn)程1添加數(shù)據(jù)到隊(duì)列')
def task2(q):
  print(q.get())
  print('進(jìn)程2從隊(duì)列中獲取數(shù)據(jù)')
if __name__ == '__main__':
  q = Queue()

  p1 = Process(target=task1, args=(q, ))
  p2 = Process(target=task2, args=(q, ))
  p1.start()
  p2.start()
  print('主進(jìn)程')

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

在程序中,通過隊(duì)列生產(chǎn)者把數(shù)據(jù)添加到隊(duì)列中,消費(fèi)者從隊(duì)列中獲取數(shù)據(jù)

from multiprocessing import Process, Queue
import time


# 生產(chǎn)者
def producer(name, food, q):
  for i in range(10):
    data = food, i
    msg = f'用戶{name}開始制作{data}'
    print(msg)
    q.put(data)
    time.sleep(0.1)
# 消費(fèi)者
def consumer(name, q):
  while True:
    data = q.get()
    if not data:
      break

    print(f'用戶{name}開始吃{data}')
if __name__ == '__main__':
  q = Queue()
  p1 = Process(target=producer, args=('neo', '煎餅', q))
  p2 = Process(target=producer, args=('wick', '肉包', q))

  c1 = Process(target=consumer, args=('cwz', q))
  c2 = Process(target=consumer, args=('woods', q))

  p1.start()
  p2.start()
  
  c1.daemon = True
  c2.daemon = True
  c1.start()
  c2.start()
  print('主')

線程

線程的概念

進(jìn)程與線程都是虛擬單位

進(jìn)程:資源單位

線程:執(zhí)行單位

開啟一個(gè)進(jìn)程,一定會(huì)有一個(gè)線程,線程才是真正執(zhí)行者

開啟進(jìn)程:

  • 開辟一個(gè)名稱空間,每開啟一個(gè)進(jìn)程都會(huì)占用一份內(nèi)存資源
  • 會(huì)自帶一個(gè)線程

開啟線程:

  • 一個(gè)進(jìn)程可以開啟多個(gè)線程
  • 線程的開銷遠(yuǎn)小于進(jìn)程

注意:線程不能實(shí)現(xiàn)并行,線程只能實(shí)現(xiàn)并發(fā),進(jìn)程可以實(shí)現(xiàn)并行

線程的兩種創(chuàng)建方式

from threading import Thread
import time
# 創(chuàng)建線程方式1
def task():
  print('線程開啟')
  time.sleep(1)
  print('線程結(jié)束')

if __name__ == '__main__':
  t = Thread(target=task)
  t.start()
# 創(chuàng)建線程方式2
class MyThread(Thread):
  def run(self):
    print('線程開啟...')
    time.sleep(1)
    print('線程結(jié)束...')
if __name__ == '__main__':
  t = MyThread()
  t.start()

線程對(duì)象的方法

from threading import Thread
from threading import current_thread
import time

def task():
  print(f'線程開啟{current_thread().name}')
  time.sleep(1)
  print(f'線程結(jié)束{current_thread().name}')
if __name__ == '__main__':
  t = Thread(target=task)
  print(t.isAlive())
  # t.daemon = True
  t.start()
  print(t.isAlive())

線程互斥鎖

線程之間數(shù)據(jù)是共享的

from threading import Thread
from threading import Lock
import time

mutex = Lock()
n = 100

def task(i):
  print(f'線程{i}啟動(dòng)')
  global n
  mutex.acquire()
  temp = n
  time.sleep(0.1)
  n = temp - 1
  print(n)
  mutex.release()
  
if __name__ == '__main__':
  t_l = []
  for i in range(100):
    t = Thread(target=task, args=(i, ))
    t_l.append(t)
    t.start()

  for t in t_l:
    t.join()

  print(n)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器的方法示例

    Python實(shí)現(xiàn)對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器的方法,結(jié)合實(shí)例形式分析了Python編程中一個(gè)函數(shù)使用多個(gè)裝飾器的簡(jiǎn)單操作技巧,需要的朋友可以參考下
    2018-02-02
  • Python 靜態(tài)方法和類方法實(shí)例分析

    Python 靜態(tài)方法和類方法實(shí)例分析

    這篇文章主要介紹了Python 靜態(tài)方法和類方法,結(jié)合實(shí)例形式分析了Python類、實(shí)例、靜態(tài)方法等相關(guān)概念、原理與使用技巧,需要的朋友可以參考下
    2019-11-11
  • python scatter函數(shù)用法實(shí)例詳解

    python scatter函數(shù)用法實(shí)例詳解

    這篇文章主要介紹了python scatter函數(shù)用法實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 如何將python項(xiàng)目部署在一臺(tái)服務(wù)器上

    如何將python項(xiàng)目部署在一臺(tái)服務(wù)器上

    服務(wù)器less技術(shù)是一種無需管理服務(wù)器即可運(yùn)行應(yīng)用程序的方法,最流行的服務(wù)器less平臺(tái)是AWS Lambda,這篇文章主要介紹了如何將python項(xiàng)目部署在一臺(tái)服務(wù)器上,需要的朋友可以參考下
    2023-10-10
  • selenium查找網(wǎng)頁出現(xiàn)加載卡頓或失敗的解決方法

    selenium查找網(wǎng)頁出現(xiàn)加載卡頓或失敗的解決方法

    這篇文章主要為大家詳細(xì)介紹了selenium查找網(wǎng)頁時(shí)如何處理網(wǎng)站資源一直加載非??D或者失敗的情況,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-10-10
  • python寫入并獲取剪切板內(nèi)容的實(shí)例

    python寫入并獲取剪切板內(nèi)容的實(shí)例

    今天小編就為大家分享一篇python寫入并獲取剪切板內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 使用python構(gòu)建WebSocket客戶端的教程詳解

    使用python構(gòu)建WebSocket客戶端的教程詳解

    WebSocket是一種在客戶端和服務(wù)器之間實(shí)現(xiàn)雙向通信的協(xié)議,常用于實(shí)時(shí)聊天、實(shí)時(shí)數(shù)據(jù)更新等場(chǎng)景,Python提供了許多庫來實(shí)現(xiàn) WebSocket客戶端,本教程將介紹如何使用Python構(gòu)建WebSocket客戶端,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • python爬蟲模塊URL管理器模塊用法解析

    python爬蟲模塊URL管理器模塊用法解析

    這篇文章主要介紹了python爬蟲模塊URL管理器模塊用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • pandas如何使用列表和字典創(chuàng)建?Series

    pandas如何使用列表和字典創(chuàng)建?Series

    這篇文章主要介紹了pandas如何使用列表和字典創(chuàng)建?Series,pandas 是基于NumPy的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,下文我們就來看看文章是怎樣介紹pandas,需要的朋友也可以參考一下
    2021-12-12
  • python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例

    python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例

    今天小編就為大家分享一篇python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評(píng)論