1. 程式人生 > >網絡編程 ----------進程

網絡編程 ----------進程

專用 and join() 實現 命名 async term mina 守護

multiprocessing 模塊

功能:

支持多進程 ,提供了Process(創建子進程)/ Queue(隊列)lock(鎖)

與線程不同,進程沒有任何共享狀態,進程修改數據僅限於該進程內

Process([group[,) 該類字例化得到一個對象,表示一個了進程中的任務

強調:

需要用關鍵字的方式來指定參數

args指定的為傳給target函數的位置參數,是一個元組形式,必須有逗號

p.start(): 啟動進程,並調用該子進程中的p.run()#(方法)

p.terminate():強制終止進程p,不會進行任何清理操作(僵屍進程)

p.join 主線程等待p終止

p.daemon: 守護進程

守護進程

  1主進程代碼結束後終止

  2守護進程無法開啟了進程,否則拋出異常

同步鎖:

  共享的內存空間

  with 功能 和文件操作的IO一樣

  with lock:

    get(n)

  def task(n,lock):

    search(n):

    lock.acquire() 加鎖

    get(n)

    lock.release() 開鎖

IPC機制(進程之間的交互)

1 多進程之間內存共享

  2 競爭帶來的不安全 >>>加鎖

方式 :

   1 隊列 (管道 + 鎖 》》》先進先出) queue

    2 管道

進程

抽象單位

是一個資源單位

默認一個線程

進程池

  控制進程的數目

進程池同步調用

  提交一個任務,等到任務結束後才能執行下一個任務

apply: 傳入兩個參數,第一個指定,第二個向進程池提交任務實現後立馬拿到結果

import multiprocessing

import time
import random
import osdef walk(n):
    print(%s is walk%os.getpid())
    time.sleep(random.random())
    return n
if __name__ == __main__
: p = multiprocessing.Pool(4) for i in range(5): q = p.apply(walk,args=(i,)) print(q)

進程池異步提交

  提交完一個任務過後不會在原地等待,而是把所有任務提交完後用get獲取

apply_async:  向進程池提交任務,只管提交任務不管執行,
執行方法: close: 結束任務
               join :等待進程池不在提交任務,並且任務結束和計算個數 
               get : 獲取返回值
import multiprocessing
import time
import random
import os
def walk(n):
    print(%s is walking%os.getpid())
    time.sleep(2)
    return n
if __name__ == __main__:
    p = multiprocessing.Pool(4)
    li=[]
    for i in range(6):
        q = p.apply_async(walk,args=(i,))
        li.append(q)
    p.close()
    p.join()
    for i in li:
        print(i.get())
        

異步調用

提交完任務,不用在原地等待

命名空間是用來存儲數據的在內存裏

水平擴展

  增加計算機的數量,並沒有提高計算機的性能

虛擬化

  同時跑多個系統

分布式和集中式

  集中式在一臺機器上執行任務

  分布式將任務分散到多臺機器上

joinableQueue模塊

  比Queue 多了兩個函數,一個是task_done,另一個join,都是專用於全球性進行 編程的,大多數用於生產者和消費者之間的。

  task_done: 是用於在get後面的,告訴os已經處理完了內容

  join : 是說Queue裏面的生產數據全部處理完了

  

OS 模塊:

1. os.name——判斷現在正在實用的平臺,Windows 返回 ‘nt‘; Linux 返回’posix‘

2. os.getcwd()——得到當前工作的目錄。

3. os.listdir()——指定所有目錄下所有的文件和目錄

4.os.getpid() ------查看進程的序列號

網絡編程 ----------進程