激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python多進程基礎詳解

python多進程基礎詳解

2022-01-21 00:10七層漢堡王 Python

這篇文章主要介紹了Python多進程基礎,結合實例形式分析了Python多進程原理、開啟使用進程、進程隊列、進程池等相關概念與使用方法,需要的朋友可以參考下

進程

什么是進程
進程指的是一個程序的運行過程,或者說一個正在執行的程序
所以說進程一種虛擬的概念,該虛擬概念起源操作系統

一個CPU 同一時刻只能執行一件事

 

開啟一個進程

from  multiprocessing import Process
import time
def task(name):
  print('%s is running'%name)
  time.sleep(3)
  print('%s is done'%name)
# 開啟子進程的操作必須放到
# if __name__ == '__main__'的子代碼中
# 子進程不會再次加載
if __name__ == '__main__':
  p=Process(target=task,args=('小王',))
  # p=Process(target=task,kwargs={'name':'小王'})
  # print(p)
  p.start()
  # 主進程只是向操作系統發送了一個開啟子進程的信號
  # p.start()
  # 1.操作系統先申請內存空間
  # 2.把主進程的數據拷貝到子進程里面
  # 3.調用cup才能運行里面的代碼
  # 創造進程的開銷大
  print('主')

python多進程基礎詳解

 

JOIN方法

當前進程jion別的進程。當前進程就會等到別的進程執行完畢了才會繼續開始往下執行

python多進程基礎詳解

from multiprocessing import Process
import time

def task(name, n):
  print('%s is running' % name)
  time.sleep(n)
  print('%s is done' % name)

if __name__ == '__main__':
  start = time.time()
  p_l = []
  for i in range(1, 4):
      p = Process(target=task, args=('小王%s' % i, i))
      p_l.append(p)
      p.start()
  # 主進程等待子進程
  for p in p_l:
      p.join()
  print('主', (time.time() - start))

 

進程之間空間隔離

from multiprocessing import  Process
# 這個n是主進程里面的值
n = 100
def task():
  global n
  # 改的是子進程里面的全局變量
  # 主進程里面沒有改
  n = 0
if __name__ == '__main__':
  p=Process(target=task)
  p.start()
  p.join()
  print(n)

python多進程基礎詳解

 

進程的常用方法

current_process 查看pid(進程id)

# 1. 進程pid:每一個進程在操作系統內都有一個唯一的id號,稱之為pid
from multiprocessing import Process, current_process
import time

def task():
  print('%s is running' % current_process().pid)
  time.sleep(3)
  print('%s is done' % current_process().pid)

# 開啟子進程的操作必須放到
# if __name__ == '__main__'的子代碼中
# 子進程不會再次加載
if __name__ == '__main__':
  p = Process(target=task)
  p.start()
  print('主', current_process().pid)

python多進程基礎詳解

os.getpid() 查看進程id

# os模塊也可以
from multiprocessing import Process, current_process
import time, os

def task():
  print('%s is running 爹是%s' % (os.getpid(), os.getppid()))
  time.sleep(3)
  print('%s is done爹是%s' % (os.getpid(), os.getppid()))

# 開啟子進程的操作必須放到
# if __name__ == '__main__'的子代碼中
# 子進程不會再次加載
if __name__ == '__main__':
  p = Process(target=task)
  p.start()
  # 誰把主進程創造出來的
  #   用pycharm就是pycharm創造的
  print('主%s爹是%s' % (os.getpid(), os.getppid()))

python多進程基礎詳解

進程其他方法和屬性

from multiprocessing import Process,current_process
import time,os
def task():
  print('%s is running 爹是%s'%(os.getpid(),os.getppid()))
  time.sleep(30)
  print('%s is done爹是%s'%(os.getpid(),os.getppid()))
# 開啟子進程的操作必須放到
# if __name__ == '__main__'的子代碼中
# 子進程不會再次加載
if __name__ == '__main__':
  p=Process(target=task)
  p.start()
  # 誰把主進程創造出來的
  # 用pycharm就是pycharm創造的
  # 進程的名字
  print(p.name)
  # 殺死子進程
  p.terminate()
  # 需要時間
  time.sleep(0.1)
  #  判斷子進程是否存活
  print(p.is_alive())
  print('主%s爹是%s'%(os.getpid(),os.getppid()))

python多進程基礎詳解

 

守護進程

本質就是一個"子進程",該"子進程"的生命周期<=被守護進程的生命周期
當被守護的進程執行完了。它也會被殺死

# 主進程運行完了,子進程沒有存在的意義
# 皇帝和太監不是同生,但是是同死
from  multiprocessing import Process
import time
def task(name):
  print('%s活著'%name)
  time.sleep(3)
  print('%s正常死亡'%name)
if __name__ == '__main__':
  p1=Process(target=task,args=('老太監',))
  # 聲明子進程為守護進程
  p1.daemon = True
  p1.start()
  time.sleep(1)
  print('皇帝正在死亡')

python多進程基礎詳解

 

互斥鎖

進程之間內存空間互相隔離,怎樣實現共享數據
進程之間內存數據不共享,但是共享同一套文件系統,所以訪問同一個文件,是沒有問題的,
而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理

'''
搶票
  查票
  購票
互斥鎖:
  在程序中進行加鎖處理
  必須要釋放鎖下一個鎖才能獲取,所以程序在合適的時候必須要有釋放鎖
所以用文件來處理共享數據
  1.速度慢
  2.必須有互斥鎖
'''
import json
import time,random
from multiprocessing import Process,Lock
# 查票
def search(name):
  with open('db.json','rt',encoding='utf-8')as f:
      dic = json.load(f)
  # 模擬查票時間
  time.sleep(1)
  print('%s 查看到余票為 %s'%(name,dic['count']))
# 購票
# 第二個get子進程不會是第一個get子進程修改后count的結果
# 加互斥鎖,把這一部分并發變成串行,
# 但是犧牲了效率,保證了數據安全
def get(name):
  with open('db.json','rt',encoding='utf-8')as f:
      dic = json.load(f)
  if dic['count']>0:
      dic['count']-=1
      time.sleep(random.randint(1,3))
      with open('db.json', 'wt', encoding='utf-8')as f:
          json.dump(dic,f)
          print('%s 購票成功'%name)
  else:
      print('%s 查看到沒有票了'%name)
def task(name,mutex):
  # 并發
  search(name)
  # 串行
  # 加互斥鎖
  mutex.acquire()
  get(name)
  # 釋放互斥鎖
  mutex.release()
# if __name__ == '__main__':
#     for i in range(10):
#         p=Process(target=task,args=('路人%s'%i,))
#         p.start()
#         #  join只能將進程的任務整體變成串行
#         # 互斥鎖可以局部串行
#         p.join()
#         # 數據安全,是指讀的時候無所謂,寫的(改的)時候必須安全
#         # 寫的時候是串行,讀的時候并發
# 加鎖
if __name__ == '__main__':
  # 主進程加鎖
  mutex=Lock()
  for i in range(10):
      # 鎖傳入子進程
      p=Process(target=task,args=('路人%s'%i,mutex))
      p.start()
      #  join只能將進程的任務整體變成串行
      # 互斥鎖可以局部串行
      # p.join()
      # 數據安全,是指讀的時候無所謂,寫的(改的)時候必須安全
      # 寫的時候是串行,讀的時候并發

db.json 中只有10張票。如果沒有加鎖。則可能會出現票唄多賣的情況
python多進程基礎詳解

 

進程間通信(IPC機制)

'''
速度快
鎖問題解決
ipc機制
  進程彼此之間互相隔離,要實現進程間通信(IPC),
  multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的
  共享內存空間
  隊列=管道+鎖
'''
from  multiprocessing import Queue
# 占用的內存,最好小數據,消息數據,下載地址
# Queue(限制隊列里面的個數)
# 先進先出
q=Queue(3)
# 添加
q.put('a')
q.put('b')
q.put({'x':2})
print('籃子滿了')
# 隊列滿了,相當于鎖了
# q.put({'x':2})
# 提取
print(q.get())
print(q.get())
print(q.get())
# # 隊列為空,等待加入,也會阻塞,相當于鎖了
print('隊列為空')
print(q.get())

隊列被取完了 后面的q.get() 會阻塞直到有新的元素。所以程序不會結束

python多進程基礎詳解

 

JoinableQueue 來實現生產消費者

JoinableQueue#task_done()方法當隊列里面沒有元素會結束線程

'''
小王和小周每人生產10分包子和土豆絲
小戴和小楊一直吃,當隊列里面沒有食物時。終結進程
'''
import time, random
from multiprocessing import Process, JoinableQueue

def producer(name, food, q):
  for i in range(10):
      res = '%s%s' % (food, i)
      # 模擬生產數據的時間
      time.sleep(random.randint(1, 3))
      q.put(res)
      print('廚師%s生成了%s' % (name, res))

def consumer(name, q):
  while True:
      # 訂單都沒了還在等,隊列里面空了
      res = q.get()
      # 模擬處理數據的時間
      time.sleep(random.randint(1, 3))
      print('吃貨%s吃了%s' % (name, res))
      # 1每次完成隊列取一次,往q.join() ,取干凈了q.join()運行完
      q.task_done()

# 多個生產者和消費者
if __name__ == '__main__':
  q = JoinableQueue()
  # 生產者
  p1 = Process(target=producer, args=('小王', '包子', q))
  p3 = Process(target=producer, args=('小周', '土豆絲', q))
  # 消費者
  c1 = Process(target=consumer, args=('小戴', q))
  c2 = Process(target=consumer, args=('小楊', q))
  # #3.守護進程的作用: 主進程死了,消費者子進程也跟著死
  #     #把消費者變成守護進程
  c1.daemon = True
  c2.daemon = True
  p1.start()
  p3.start()
  c1.start()
  c2.start()
  p1.join()
  p3.join()
  # 2消費者task_done給q.join()發信號
  q.join()
  print('主')
  # 生產者運行完?1,2
  # 消費者運行完?1,2

當隊列為空時,不會傻傻等待而是結束進程

python多進程基礎詳解

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_39313241/article/details/120607154

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: xp123精品视频 | 三级国产三级在线 | 色污视频| 亚洲精品aaaaa | 亚洲av毛片久久久久 | www日韩大片| 亚洲一区二区三区四区精品 | 亚洲成人免费视频在线 | 黄色片网站在线看 | 老子午夜影院 | 国产喷白浆10p | 免费嗨片首页中文字幕 | 日本a∨精品中文字幕在线 狠狠干精品视频 | 男女羞羞视频在线免费观看 | 国产一国产精品一级毛片 | 欧美一级成人 | 欧美a视频在线观看 | 亚州视频在线 | 国产精品入口夜色视频大尺度 | 久久国产精品久久久久久久久久 | 欧美日韩亚州综合 | 国产精品亚洲一区二区三区在线观看 | 国产精品亚洲三区 | 免费看综艺策驰影院 | 性大片性大片免费 | 国外成人在线视频网站 | 男人久久天堂 | 成人福利免费在线观看 | 一区二区三区小视频 | 日本在线播放一区 | 毛片视频网站在线观看 | 麻豆视频国产在线观看 | 色欲香天天天综合网站 | 欧美国产一区二区三区 | 国产1区在线观看 | 国产午夜电影在线观看 | 青草av.久久免费一区 | 91高清视频在线免费观看 | 日韩精品免费看 | 久久久久久艹 | 国产乱乱视频 |