進程
進程的概念
- 進程是操作系統中最基本、重要的概念。是多道程序系統出現後,爲了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。
引入進程的原因
- 爲了提高資源利用率和系統處理能力,現階段計算機學院都是多道程序系統,即多道程序併發執行
- 優化系統資源,方便計算調度,避免系統運算紊亂
- 進程是一種數據結構,能夠清晰的刻畫動態系統的內在規律,增加程序運行時的動態性
進程特徵
- 動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的
- 併發性:任何進程的可以同其其他進程一起併發執行。
- 獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和跳讀的獨立單位
- 異步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各種獨立的、不可預知的速度向前推進
進程和程序
- 進程:程序在處理機上的一次執行過程,他是一個動態的概念
- 程序:沒有執行的代碼,是一個靜態的
進程和線程的區別
- 進程:在電腦上運行的多個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--")
多任務文件夾複製
- 獲取用戶要copy的文件夾的名稱
- 創建一個新的文件夾
- 獲取文件夾的所有待copy的文件名字
- 創建進程池
- 向進程池中添加拷貝任務
'''
多任務-進程-文件夾複製
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()