1. 程式人生 > >Python-程序-基礎使用

Python-程序-基礎使用

例項1

# coding=utf-8

from multiprocessing import Process
import os

"""
多程序中,每個程序中所有資料(包括全域性變數)都各有擁有一份,互不影響
父程序、子程序執行順序沒有規律,完全取決於作業系統的排程演算法

Process([group [, target [, name [, args [, kwargs]]]]])
    target:表示這個程序例項所呼叫物件;
    args:表示呼叫物件的位置引數元組;
    kwargs:表示呼叫物件的關鍵字引數字典;
    name:為當前程序例項的別名;
    group:大多數情況下用不到;

Process類常用方法:
    is_alive():判斷程序例項是否還在執行;
    join([timeout]):是否等待程序例項執行結束,或等待多少秒;
    start():啟動程序例項(建立子程序);
    run():如果沒有給定target引數,對這個物件呼叫start()方法時,就將執行物件中的run()方法;
    terminate():不管任務是否完成,立即終止;

Process類常用屬性:
    name:當前程序例項別名,預設為Process-N,N為從1開始遞增的整數;
    pid:當前程序例項的PID值;
"""


# 子程序要執行的程式碼
def run_proc(name):
    print('子程序執行中,name= %s ,pid=%d...' % (name, os.getpid()))


if __name__ == '__main__':
    print('父程序 %d.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('子程序將要執行')
    p.start()  # 啟動
    p.join()  # 等待子程序結束後再繼續往下執行,通常用於程序間的同步。
    print('子程序已結束')

例項2

# coding=utf-8
from multiprocessing import Process
import time
import os


# 兩個子程序將會呼叫的兩個方法
def worker_1(interval):
    print("worker_1,父程序(%s),當前程序(%s)" % (os.getppid(), os.getpid()))
    t_start = time.time()
    time.sleep(interval)  # 程式將會被掛起interval秒
    t_end = time.time()
    print("worker_1,執行時間為'%0.2f'秒" % (t_end - t_start))


def worker_2(interval):
    print("worker_2,父程序(%s),當前程序(%s)" % (os.getppid(), os.getpid()))
    t_start = time.time()
    time.sleep(interval)
    t_end = time.time()
    print("worker_2,執行時間為'%0.2f'秒" % (t_end - t_start))


def main():
    print("程序ID:%s" % os.getpid())  # 輸出當前程式的ID
    p1 = Process(target=worker_1, args=(2,))
    p2 = Process(target=worker_2, name="程序2", args=(1,))  # 如果不指定name引數,預設的程序物件名稱為Process-N,N為一個遞增的整數
    p1.start()
    p2.start()
    print("p2.is_alive:%s" % p2.is_alive())  # 同時父程序仍然往下執行,如果p2程序還在執行,將會返回True
    # 輸出p1和p2程序的別名和pid
    print("p1.name=%s" % p1.name)
    print("p1.pid=%s" % p1.pid)
    print("p2.name=%s" % p2.name)
    print("p2.pid=%s" % p2.pid)

    # join括號中不攜帶引數,表示父程序在這個位置要等待p1程序執行完成後,
    # 再繼續執行下面的語句,一般用於程序間的資料同步,
    # 如果不寫這一句,下面的is_alive判斷將會是True,
    # 在shell(cmd)裡面呼叫這個程式時,可以完整的看到這個過程
    p1.join()
    print("p1.is_alive=%s" % p1.is_alive())


if __name__ == '__main__':
    main()