1. 程式人生 > >多線程&多進程

多線程&多進程

work 自動 多進程 num ces 多線程 分配 tar 一次

一、多線程

  概念 進程是程序在計算機上的一次執行活動。當你運行一個程序,你就啟動了一個進程。顯然,程序是死的(靜態的),進程是活的(動態的)。進程可以分為系統進程和用戶進程。凡是用於完成操作系統的各種功能的進程就是系統進程,它們就是處於運行狀態下的操作系統本身;用戶進程就不必我多講了吧,所有由你啟動的進程都是用戶進程。進程是操作系統進行資源分配的單位。 它的思想簡單介紹如下:在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如10毫秒),這樣用戶根本感覺不出來CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣。但實際上在任何一個時間內有且僅有一個進程占有CPU。

二、多進程和多線程的區別

  多線程使用的是cpu的一個核,適合io密集型 多進程使用的是cpu的多個核,適合運算密集型 組件 Python提供了非常好用的多進程包,multiprocessing,我們在使用的時候,只需要導入該模塊就可以了。 Multiprocessing支持子進程,通信,共享數據,執行不同形式的同步,提供了Process,Pipe, Lock等組件

三、課堂字段,方法補充。

# p = multiprocessing.Process(target=, args=)
# target 指定的是當進程執行時,需要執行的函數
# args 是當進程執行時,需要給函數傳入的參數
# 註意: args必須是一個tuple, 特別是當函數需要傳入一個參數時 (1,)
# p 代表的是一個多進程,
# p.is_alive() 判斷進程是否存活
# p.run() 啟動進程
# p.start() 啟動進程,他會自動調用run方法,推薦使用start
# p.join(timeout) 等待子進程結束或者到超時時間
# p.terminate() 強制子進程退出
# p.name 進程的名字
# p.pid 進程的pid

案例一、

import multiprocessing

import time


def worker(args, interval):
print("start worker {0}".format(args))
time.sleep(interval)
print("end worker {0}".format(args))

def main():
print("start main")
p1 = multiprocessing.Process(target=worker, args=(1, 1))
p2 = multiprocessing.Process(target=worker, args=(2, 2))
p3 = multiprocessing.Process(target=worker, args=(3, 3))
p1.start()
p2.start()
p3.start()
print("end main")

if __name__ == ‘__main__‘:
main()

案例二、
import multiprocessing

import time


def worker(args, interval):
print("start worker {0}".format(args))
time.sleep(interval)
print("end worker {0}".format(args))

def main():
print("start main")
p1 = multiprocessing.Process(target=worker, args=(1, 1))
p2 = multiprocessing.Process(target=worker, args=(2, 2))
p3 = multiprocessing.Process(target=worker, args=(3, 3))
p1.start()
p1.join(timeout=0.5)
p2.start()
p3.start()
print("the number of CPU is: {0}".format(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("The name of active children is: {0}, pid is: {1} is alive".format(p.name, p.pid))
print("end main")

if __name__ == ‘__main__‘:
main()

案例三、
import time

import multiprocessing


def add1(lock, value, number):
with lock:
print("start add1 number= {0}".format(number))
for i in range(1, 5):
number += value
time.sleep(0.3)
print("number = {0}".format(number))

def add3(lock, value, number):
lock.acquire()
print("start add3 number= {0}".format(number))
try:
for i in range(1, 5):
number += value
time.sleep(0.3)
print("number = {0}".format(number))
except Exception as e:
raise e
finally:
lock.release()
pass

if __name__ == ‘__main__‘:
print("start main")
number = 0
lock = multiprocessing.Lock()
p1 = multiprocessing.Process(target=add1, args=(lock, 1, number))
p3 = multiprocessing.Process(target=add3, args=(lock, 3, number))
p1.start()
p3.start()
print("end main")

案例四、
import time

import multiprocessing

from multiprocessing import Value, Array, Manager


def add1(value, number):
print("start add1 number= {0}".format(number.value))
for i in range(1, 5):
number.value += value
print("number = {0}".format(number.value))

def add3(value, number):
print("start add3 number= {0}".format(number.value))
try:
for i in range(1, 5):
number.value += value
print("number = {0}".format(number.value))
except Exception as e:
raise e

if __name__ == ‘__main__‘:
print("start main")
number = Value(‘d‘, 0)
p1 = multiprocessing.Process(target=add1, args=(1, number))
p3 = multiprocessing.Process(target=add3, args=(3, number))
p1.start()
p3.start()
print("end main")

多線程&多進程