多线程和mysql
多線程
1、多線程的定義:
什么是線程:
線程是操作系統能夠進行運算調度的最小單位(程序執行流的最小單元)。它被包含在進程之中,
是進程中的實際運作單位。一個進程中可以并發多個線程,每條線程并行執行不同的任務。
(線程是進程中的一個實體,是被系統獨立調度和分派的基本單元)
線程和進程的區別
(1)線程共享內存空間;進程的內存是獨立的
(2)同一個進程的線程之間可以直接交流;兩個進程想通信,必須通過一個中間代理來實現
(3)創建新線程很簡單; 創建新進程需要對其父進程進行一次克隆
(4)一個線程可以控制和操作同一進程里的其他線程;但是進程只能操作子進程
(5)改變主線程(如優先權),可能會影響其它線程;改變父進程,不影響子進程
現在pc都是多核的,使用多線程能充分利用 CPU 來提供程序的執行效率
線程:
?? ?線程是一個基本的 CPU 執行單元,它必須依托于進程存活
進程:
?? ?進程是指一個程序在給定數據集合上的一次執行過程,是系統進行資源分配和運行調用的獨立單位。
?? ?可以簡單地理解為操作系統中正在執行的程序。也就說,每個應用程序都有一個自己的進程
每一個進程啟動時都會最先產生一個線程,即主線程。然后主線程會再創建其他的子線程
兩者的區別
線程必須在某個進程中執行。
一個進程可包含多個線程,其中有且只有一個主線程。
多線程共享同個地址空間、打開的文件以及其他資源。
多進程共享物理內存、磁盤、打印機以及其他資源。
單線程:
例1:
from time import ctime, sleepdef music(a):for i in range(2):print 'I was listening to %s. %s' % (a, ctime())sleep(1)def movie(b):for i in range(2):print 'I was watching to %s. %s' % (b, ctime())sleep(5)music('告白氣球')
movie('戰狼')
print 'all over %s' % ctime()
總結:單線程, 之前的操作系統處理問題都是單任務的,如果我想做聽音樂和看電影兩件事,那么一定要先排一下順序,然后按順序執行。即一個任務只能在上一個任務完成后執行。
多線程:
情況1:
????? python有兩個模塊實現多線程thread 和threading ,因為threading 彌補了thread 的一些缺點。
import threading
from time import sleep, ctimedef music(a):for i in range(2):print 'I was listening to %s. %s' % (a, ctime())sleep(1)def movie(b):for i in range(2):print 'I was watching to %s. %s' % (b, ctime())sleep(5)# 創建threads列表
threads = []t1 = threading.Thread(target=music, args=('告白氣球',))
threads.append(t1)
t2 = threading.Thread(target=movie, args=('戰狼',))
threads.append(t2)
for t in threads:# 當父線程執行完最后一條語句后:print 'all over %s' %ctime()# 沒有等待子線程,直接就退出了,同時我們的子線程也一同結束t.setDaemon(True)t.start()
print 'all over %s' % ctime()
???
總結:
??????? 從結果中可以看出,主線程沒有等待子線程,執行后就直接就退出了程序執行,同時我們的子線程也一同結束。
?
多線程?
情況2:
例1:
import threading
from time import sleep, ctimedef music(a):for i in range(2):print 'I was listening to %s. %s' %(a,ctime())sleep(1)
def movie(b):for i in range(2):print 'I was watching to %s. %s' %(b,ctime())sleep(5)# 創建threads列表
threads=[]t1 = threading.Thread(target=music,args=('告白氣球',))
threads.append(t1)
t2 = threading.Thread(target=movie,args=('泰坦尼克號',))
threads.append(t2)
for t in threads:t.setDaemon(True)t.start()
# join()的作用是,在子線程完成之前,這個子線程的父線程將一直被阻塞
t.join()
print 'all over %s' %ctime()
總結:
???????? 在子線程完成之前,這個子線程的父線程將一直被阻塞。也就是說music 和move 是同時執行。且主線程在等待子線程,沒有直接結束。其中的關鍵是join()
??? join()的作用是,在子線程完成之前,這個子線程的父線程將一直被阻塞.
??? 故主線程是在子線程執行完之后才執行。
例2: import time from threading import Threaddef Foo(arg):for item in range(10):print itemtime.sleep(1)print 'before' t1 = Thread(target=Foo, args=(1,)) t1.setDaemon(True) t1.start() print 'after' """ 主線程沒有結束,子線程還會執行 什么時候主線程執行完了,子線程跟著主線程一起銷毀了 """ time.sleep(5)
總結:
????? 從結果中可看到,主線程和子線程一起執行,但是主線程執行完成后并沒有停止執行,而是子線程繼續執行。
例3:
import time from threading import Threaddef Foo(arg):for item in range(10):print itemtime.sleep(1)print 'before' t1 = Thread(target=Foo, args=(1,)) # t1.setDaemon(True) t1.start() # 主線程到join()不往下走了,直到到子線程執行完了 t1.join(5) print 'after' """ 主線程沒有結束,子線程還會執行 什么時候主線程執行完了,子線程跟著主線程一起銷毀了 """ # time.sleep(5)
線程和函數建立關系
from threading import Threaddef Foo(arg):print argprint 'before'# 讓線程和函數建立關系 t1 = Thread(target=Foo, args=(1,)) t1.start() print t1.getName() t2 = Thread(target=Foo, args=(2,)) t2.start() print t2.getName() print 'after'
mysql
import MySQLdb# 打開門
conn = MySQLdb.Connect(host ='127.0.0.1',user='root',passwd='dd',db='python3')# 伸出手
cur = conn.cursor() # 創建一個手# 拿東西
# 這個操作影響了多少行(有多少行被操作了)
reCount = cur.execute('select * from userInfo')# 把手伸回來
cur.close()
# 把門觀賞
conn.close()print reCount
總結
- 上一篇: iscsi网络磁盘共享
- 下一篇: LVS_DR实现(负载均衡)及LVS_D