本篇文章為大家展示了Python中線程與進(jìn)程的區(qū)別,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)靖宇免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Python 線程與進(jìn)程
線程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
使用 threading 模塊
方法一:
import threading import time def foo(n): print('foo %s'%n) time.sleep(1) print('end foo') def bar(n): print('bar %s'%n) time.sleep(2) print('end bar') t1 = threading.Thread(target=foo, args=(1,)) t2 = threading.Thread(target=bar, args=(2,)) t1.start() t2.start() print('........in the main..........')
運(yùn)行結(jié)果:
foo 1 bar 2 ........in the main.......... end foo end bar
方法二:
import time, threading class MyThread(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) self.num = num def run(self): #定義線程要運(yùn)行的函數(shù) print("running on number:%s" % self.num) time.sleep(3) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
運(yùn)行結(jié)果:
running on number:1 running on number:2
join 方法使得主線程等待子線程完成才繼續(xù)
import threading import time begin = time.time() def foo(n): print('foo %s'%n) time.sleep(1) print('end foo') def bar(n): print('bar %s'%n) time.sleep(2) print('end bar') t1 = threading.Thread(target=foo, args=(1,)) t2 = threading.Thread(target=bar, args=(2,)) t1.start() t2.start() t1.join() t2.join() print('........in the main..........')
運(yùn)行結(jié)果:
foo 1 bar 2 end foo end bar ........in the main..........
在計(jì)算密集型任務(wù)中串行與多線程進(jìn)行對(duì)比
import threading, time begin = time.time() def add(n): sum = 0 for i in range(n): sum += i print(sum) add(100000000) add(200000000) end = time.time() print(end-begin)
運(yùn)行結(jié)果:
4999999950000000 19999999900000000 17.66856598854065
import threading, time begin = time.time() def add(n): sum = 0 for i in range(n): sum += i print(sum) t1 = threading.Thread(target=add, args=(100000000,)) t1.start() t2 = threading.Thread(target=add, args=(200000000,)) t2.start() t1.join() t2.join() end = time.time() print(end-begin)
運(yùn)行結(jié)果:
4999999950000000 19999999900000000 21.088160276412964 # 結(jié)果為串行運(yùn)行比多線程運(yùn)行更快
Cpython 中有 GIL (Global Interpreter Lock,全局解釋器鎖),所以在同一時(shí)刻,只能有一個(gè)線程進(jìn)入調(diào)度。如果任務(wù)是IO密集型的,可以使用多線程;如果任務(wù)是計(jì)算密集型的,最優(yōu)方法是改成 C。
setDaemon()
調(diào)用該方法只要是主線程完成,不管子線程是否完成都要和主線程一起退出。
threading.currentThread()
返回當(dāng)前的線程變量。
threading.active_count()
返回正在運(yùn)行的線程數(shù)量。
import threading, time from time import ctime,sleep def music(func): print(threading.current_thread()) for i in range(2): print("Begin listening to %s. %s" %(func, ctime())) sleep(2) print("end listening %s" %ctime()) def movie(func): print(threading.current_thread()) for i in range(2): print("Begin watching at the %s %s" %{func, ctime()}) sleep(4) print("end watching %s" %ctime()) threads = [] t1 = threading.Thread(target=music, args=('klvchen',)) threads.append(t1) t2 = threading.Thread(target=movie, args=('lili',)) threads.append(t2) if __name__ == '__main__': for t in threads: t.setDaemon(True) t.start() print(threading.current_thread()) print(threading.active_count()) print("all over %s" %ctime())
運(yùn)行結(jié)果:
Begin listening to klvchen. Wed Jul 11 23:43:51 2018 <_MainThread(MainThread, started 9444)> 3 all over Wed Jul 11 23:43:51 2018
上述內(nèi)容就是Python中線程與進(jìn)程的區(qū)別,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。