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線程
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
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