日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

多线程和mysql

發(fā)布時(shí)間:2023/11/27 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程和mysql 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多線程

1、多線程的定義:

什么是線程:
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位(程序執(zhí)行流的最小單元)。它被包含在進(jìn)程之中,
是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
(線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單元)

線程和進(jìn)程的區(qū)別

(1)線程共享內(nèi)存空間;進(jìn)程的內(nèi)存是獨(dú)立的

(2)同一個(gè)進(jìn)程的線程之間可以直接交流;兩個(gè)進(jìn)程想通信,必須通過(guò)一個(gè)中間代理來(lái)實(shí)現(xiàn)

(3)創(chuàng)建新線程很簡(jiǎn)單; 創(chuàng)建新進(jìn)程需要對(duì)其父進(jìn)程進(jìn)行一次克隆

(4)一個(gè)線程可以控制和操作同一進(jìn)程里的其他線程;但是進(jìn)程只能操作子進(jìn)程

(5)改變主線程(如優(yōu)先權(quán)),可能會(huì)影響其它線程;改變父進(jìn)程,不影響子進(jìn)程

現(xiàn)在pc都是多核的,使用多線程能充分利用 CPU 來(lái)提供程序的執(zhí)行效率
線程:
?? ?線程是一個(gè)基本的 CPU 執(zhí)行單元,它必須依托于進(jìn)程存活
進(jìn)程:
?? ?進(jìn)程是指一個(gè)程序在給定數(shù)據(jù)集合上的一次執(zhí)行過(guò)程,是系統(tǒng)進(jìn)行資源分配和運(yùn)行調(diào)用的獨(dú)立單位。
?? ?可以簡(jiǎn)單地理解為操作系統(tǒng)中正在執(zhí)行的程序。也就說(shuō),每個(gè)應(yīng)用程序都有一個(gè)自己的進(jìn)程

每一個(gè)進(jìn)程啟動(dòng)時(shí)都會(huì)最先產(chǎn)生一個(gè)線程,即主線程。然后主線程會(huì)再創(chuàng)建其他的子線程

兩者的區(qū)別
線程必須在某個(gè)進(jìn)程中執(zhí)行。
一個(gè)進(jìn)程可包含多個(gè)線程,其中有且只有一個(gè)主線程。
多線程共享同個(gè)地址空間、打開(kāi)的文件以及其他資源。
多進(jìn)程共享物理內(nèi)存、磁盤、打印機(jī)以及其他資源。

單線程:

例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('戰(zhàn)狼')
print 'all over %s' % ctime()

總結(jié):單線程, 之前的操作系統(tǒng)處理問(wèn)題都是單任務(wù)的,如果我想做聽(tīng)音樂(lè)和看電影兩件事,那么一定要先排一下順序,然后按順序執(zhí)行。即一個(gè)任務(wù)只能在上一個(gè)任務(wù)完成后執(zhí)行。

多線程:

情況1:

????? python有兩個(gè)模塊實(shí)現(xiàn)多線程thread 和threading ,因?yàn)閠hreading 彌補(bǔ)了thread 的一些缺點(diǎn)。

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)# 創(chuàng)建threads列表
threads = []t1 = threading.Thread(target=music, args=('告白氣球',))
threads.append(t1)
t2 = threading.Thread(target=movie, args=('戰(zhàn)狼',))
threads.append(t2)
for t in threads:# 當(dāng)父線程執(zhí)行完最后一條語(yǔ)句后:print 'all over %s' %ctime()# 沒(méi)有等待子線程,直接就退出了,同時(shí)我們的子線程也一同結(jié)束t.setDaemon(True)t.start()
print 'all over %s' % ctime()

???

總結(jié):

??????? 從結(jié)果中可以看出,主線程沒(méi)有等待子線程,執(zhí)行后就直接就退出了程序執(zhí)行,同時(shí)我們的子線程也一同結(jié)束。

?

多線程?

情況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)# 創(chuàng)建threads列表
threads=[]t1 = threading.Thread(target=music,args=('告白氣球',))
threads.append(t1)
t2 = threading.Thread(target=movie,args=('泰坦尼克號(hào)',))
threads.append(t2)
for t in threads:t.setDaemon(True)t.start()
# join()的作用是,在子線程完成之前,這個(gè)子線程的父線程將一直被阻塞
t.join()
print 'all over %s' %ctime()

總結(jié):

???????? 在子線程完成之前,這個(gè)子線程的父線程將一直被阻塞。也就是說(shuō)music 和move 是同時(shí)執(zhí)行。且主線程在等待子線程,沒(méi)有直接結(jié)束。其中的關(guān)鍵是join()

??? join()的作用是,在子線程完成之前,這個(gè)子線程的父線程將一直被阻塞.

??? 故主線程是在子線程執(zhí)行完之后才執(zhí)行。

例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'
"""
主線程沒(méi)有結(jié)束,子線程還會(huì)執(zhí)行
什么時(shí)候主線程執(zhí)行完了,子線程跟著主線程一起銷毀了
"""
time.sleep(5)

總結(jié):

????? 從結(jié)果中可看到,主線程和子線程一起執(zhí)行,但是主線程執(zhí)行完成后并沒(méi)有停止執(zhí)行,而是子線程繼續(xù)執(zhí)行。

例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()
# 主線程到j(luò)oin()不往下走了,直到到子線程執(zhí)行完了
t1.join(5)
print 'after'
"""
主線程沒(méi)有結(jié)束,子線程還會(huì)執(zhí)行
什么時(shí)候主線程執(zhí)行完了,子線程跟著主線程一起銷毀了
"""
# time.sleep(5)

線程和函數(shù)建立關(guān)系

from threading import Threaddef Foo(arg):print argprint 'before'# 讓線程和函數(shù)建立關(guān)系
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# 打開(kāi)門
conn = MySQLdb.Connect(host ='127.0.0.1',user='root',passwd='dd',db='python3')# 伸出手
cur = conn.cursor() # 創(chuàng)建一個(gè)手# 拿東西
# 這個(gè)操作影響了多少行(有多少行被操作了)
reCount = cur.execute('select * from userInfo')# 把手伸回來(lái)
cur.close()
# 把門觀賞
conn.close()print reCount

總結(jié)

以上是生活随笔為你收集整理的多线程和mysql的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

歡迎分享!

轉(zhuǎn)載請(qǐng)說(shuō)明來(lái)源于"生活随笔",并保留原作者的名字。

本文地址:多线程和mysql