Python中線程與進程的區(qū)別

本篇文章為大家展示了Python中線程與進程的區(qū)別,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)靖宇免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

Python 線程與進程

線程是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(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..........')

運行結(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):             #定義線程要運行的函數(shù)
        print("running on number:%s" % self.num)
        time.sleep(3)
if __name__ == '__main__':
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()

運行結(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..........')

運行結(jié)果:

foo 1
bar 2
end foo
end bar
........in the main..........

在計算密集型任務(wù)中串行與多線程進行對比

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)

運行結(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)

運行結(jié)果:

4999999950000000
19999999900000000
21.088160276412964
# 結(jié)果為串行運行比多線程運行更快

Cpython 中有 GIL (Global Interpreter Lock,全局解釋器鎖),所以在同一時刻,只能有一個線程進入調(diào)度。如果任務(wù)是IO密集型的,可以使用多線程;如果任務(wù)是計算密集型的,最優(yōu)方法是改成 C。

setDaemon()

調(diào)用該方法只要是主線程完成,不管子線程是否完成都要和主線程一起退出。

threading.currentThread()

返回當前的線程變量。

threading.active_count()

返回正在運行的線程數(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())

運行結(jié)果:

<Thread(Thread-1, started daemon 5856)>
Begin listening to klvchen. Wed Jul 11 23:43:51 2018
<Thread(Thread-2, started daemon 9124)>
<_MainThread(MainThread, started 9444)>
3
all over Wed Jul 11 23:43:51 2018

上述內(nèi)容就是Python中線程與進程的區(qū)別,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:Python中線程與進程的區(qū)別
網(wǎng)頁網(wǎng)址:http://bm7419.com/article40/gijpho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、手機網(wǎng)站建設(shè)定制網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站制作、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營