多任務處理--多線程、多進程、協程

1.多線程

1)特色:python

線程的併發是利用cpu上下文的切換(是併發,不是並行)多線程

多線程執行的順序是無序的併發

多線程共享全局變量app

線程是繼承在進程裏的,沒有進程就沒有線程異步

GIL全局解釋器鎖async

只要在進行耗時的IO操做的時候,能釋放GIL,因此只要在IO密集型的代碼裏,用多線程就很合適ui

2)多任務處理實例spa

import threading

global_num = 0

lock = threading.Lock()

def test1():

    global global_num

    lock.acquire() 保證在該進程執行期間其餘進程沒法調用num變量

    for i in range(1000000):

        global_num += 1

    lock.release()

 

def test2():

    global global_num

    lock.acquire()

    for i in range(1000000):

        global_num += 1

    lock.release()

 

t1 = threading.Thread(target=test1)

t2 = threading.Thread(target=test2)

t1.start()

t2.start()

t1.join() 保證兩個子進程執行完成後再執行主進程

t2.join()

print(global_num)

 

輸出結果:操作系統

2000000線程

 

2.多進程

1)特色

一個程序運行起來以後,代碼+用到的資源稱之爲進程,它是操做系統分配資源的基本單位,不只能夠經過線程完成多任務,進程也是能夠的

進程之間是相互獨立的

cpu密集的時候適合用多進程

進程之間的資源不共享

2)多任務處理實例

import time

import threading

g_num = 0

def edit():

    global g_num

    for i in range(10):

        g_num += 1

def reader():

    print(g_num)

 

if __name__ == '__main__':

    p1 = multiprocessing.Process(target=edit)

    p2 = multiprocessing.Process(target=reader())

    p1.start()

    p2.start()

    p1.join()

    p2.join()

 

輸出結果:

10

0

3)進程池

import multiprocessing

import time

from multiprocessing import Pool

 

def test1():

    for i in range(10):

        time.sleep(1)

        print('task1',i)

 

def test2():

    for i in range(10):

        time.sleep(1)

        print('task2',i)

if __name__ == '__main__':

    pool = Pool(2)容許最大同時執行的進程數

    pool.apply_async(test1)

    pool.apply_async(test2)

    pool.close()

    pool.join()

 

 

輸出結果:

task1 0

task2 0

task1 1

task2 1

task1 2

task2 2

task1 3

task2 3

 

3.協程

1)特色

協程:也叫微線程,協程是在一個線程裏面的

異步IO:遇到io請求就切換

先有進程,再有線程,纔能有協程

2)多任務處理實例

import time

import gevent

from gevent import monkey

monkey.patch_all()

 

def test1(n):

    for i in range(n):

        # gevent.sleep(1)

        time.sleep(1)

        print('task1',i)

 

def test2(n):

    for i in range(n):

        # gevent.sleep(1)

        time.sleep(1)

        print('task2',i)

 

g1 = gevent.spawn(test1,10)

g2 = gevent.spawn(test2,10)

g1.join()

g2.join()

 

 

輸出結果:

task1 0

task2 0

task1 1

task2 1

task1 2

task2 2

task1 3

task2 3

相關文章
相關標籤/搜索