
*****
## Python多任務-進程
### 進程和程序
進程:正在執行的程序
程序:沒有執行的代碼,是一個靜態的
### 進程的狀態

### 使用進程實現多任務
multiprocessing模塊就是跨平臺的多進程模塊,提供了一個Process類來代表一個進程對象,這個對象可以理解為是一個獨立的進程,可以執行另外的事情。
### 線程和進程之間的對比
進程:能夠完成多任務,一臺電腦上可以同時運行多個QQ
線程:能夠完成多任務,一個QQ中的多個聊天窗口
根本區別:進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位

### 進程間通信-Queue
Queue-隊列 先進先出
### 隊列間簡單通信
模擬下載數據,與數據處理
### 多進程共享全局變量
共享全局變量不適用于多進程編程
### 進程池
當需要創建的子進程數量不多時,可以直接利用multiprocessing中的Process動態生成多個進程,但是如果是上百甚至上千個目標,手動的去創建的進程的工作量巨大,此時就可以用到multiprocessing模塊提供的Pool方法
<br>
初始化Pool時,可以指定一個最大進程數,當有新的請求提交到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 向進程池中添加拷貝任務