Python - 進程

進程

進程的概念

  • 進程是操作系統中最基本、重要的概念。是多道程序系統出現後,爲了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。

引入進程的原因

  • 爲了提高資源利用率和系統處理能力,現階段計算機學院都是多道程序系統,即多道程序併發執行
  • 優化系統資源,方便計算調度,避免系統運算紊亂
  • 進程是一種數據結構,能夠清晰的刻畫動態系統的內在規律,增加程序運行時的動態性

進程特徵

  • 動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的
  • 併發性:任何進程的可以同其其他進程一起併發執行。
  • 獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和跳讀的獨立單位
  • 異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各種獨立的、不可預知的速度向前推進

進程和程序

  • 進程:程序在處理機上的一次執行過程,他是一個動態的概念
  • 程序:沒有執行的代碼,是一個靜態的

進程和線程的區別
- 進程:在電腦上運行的多個QQ程序
- 線程:在電腦上運行的多個QQ聊天窗口
- 根本區別 : 進程是操作系統的資源分配的基本單位。 線程操作系統的任務調度和執行的基本單位

Process屬性方法介紹

方法/屬性 說明
start() 啓動多進程,t調用進程中的run()方法
run() 進程啓動時運行的方法,正是它去調用target指定的函數
join() 守護線程
name 進程的名字

使用多進程實現多任務
導入多進程:import multiprocessing
啓動多進程:start

# -*- coding: utf-8 -*- 
# @Time : 2020/2/27 10:45 
# @Author : 大數據小J

import multiprocessing


def demo():
    print('--這是1--')


def demo1():
    print('--這是2--')


def main():
    th1 = multiprocessing.Process(target=demo)
    th2 = multiprocessing.Process(target=demo1)

    # 啓動多進程
    th1.start()
    th2.start()


if __name__ == '__main__':
    main()

多進程共享全局變量

  • 共享全局變量不適用於多進程編程

進程池

  • 當需要創建的子進程數量不多時,可以直接利用multiprocessing中的Process動態生成多個進程,但是如果是上百甚至上千個目標,手動的去創建的進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法
from multiprocessing import Pool

import os,time,random

def worker(msg):
    t_start = time.time()
    print('%s開始執行,進程號爲%d'%(msg,os.getpid()))
    
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"執行完成,耗時%0.2f"%(t_stop-t_start))

def demo():
    pass

if __name__ == '__main__':
    po = Pool(3)        # 定義一個進程池
    for i in range(0,10):
        po.apply_async(worker,(i,))    
    
    print("--start--")
    po.close()      
    
    po.join()       
    print("--end--")

多任務文件夾複製

  1. 獲取用戶要copy的文件夾的名稱
  2. 創建一個新的文件夾
  3. 獲取文件夾的所有待copy的文件名字
  4. 創建進程池
  5. 向進程池中添加拷貝任務

'''
多任務-進程-文件夾複製
1.獲取用戶要複製的文件夾的名字   test
2.創建一個新的文件夾            test[復件]
3.獲取文件夾內的所有待複製的文件名字
4.創建進程池
5.向進程池添加任務
'''
import multiprocessing
import os
import time


def copy_file(q, old_folder_name, new_folder_name, file_name):
    """
    文件拷貝
    :return:None
    """
    # time.sleep(0.5)
    # print("\r從%s到%s拷貝的文件名稱爲:%s" % (old_folder_name, new_folder_name, file_name), end='')
    old_file = open(old_folder_name+'/'+file_name, 'rb')
    content = old_file.read()
    old_file.close()

    new_file = open(new_folder_name+'/'+file_name, 'wb')
    new_file.write(content)
    new_file.close()

    q.put(file_name)


def main():
    # 獲取文件夾名字
    old_folder_name = input("請輸入待複製的文件夾名字:")
    # 創建新的文件夾
    new_folder_name = old_folder_name + "復件"
    if not os.path.exists(new_folder_name):
        os.mkdir(new_folder_name)

    # 獲取文件名字
    file_names = os.listdir(old_folder_name)

    po = multiprocessing.Pool(5)
    q = multiprocessing.Manager().Queue()

    for file_name in file_names:
        po.apply_async(copy_file, args=(q, old_folder_name, new_folder_name, file_name))

    po.close()
    # po.join()

    copy_file_num = 0
    file_count = len(file_names)

    while True:
        file_name = q.get()
        copy_file_num += 1
        time.sleep(0.2)
        print("\r拷貝進度%.2f %%" % (copy_file_num*100/file_count), end='')
        if copy_file_num >= file_count:
            break


if __name__ == '__main__':
    main()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章