python3線程啟動與停止


轉自:

https://blog.csdn.net/weixin_38125866/article/details/76795462

https://www.cnblogs.com/lcchuguo/p/4687348.html

Python GIL(Global Interpreter Lock)

GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標准,但是可以用不同的編譯器來編譯成可執行代碼。
有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。
像其中的JPython就沒有GIL。然而因為CPython是大部分環境下默認的Python執行環境。所以在很多人的概念里CPython就是Python,也就想當然的把GIL歸結為Python語言的缺陷。
所以這里要先明確一點:GIL並不是Python的特性,Python完全可以不依賴於GIL

python3的線程啟動支持兩種方式:

一種是以傳入函數名開啟;

另一種是通過重寫run方法開啟;

以傳入函數名開啟:

import time
import threading

def demo(n):
   while n >= 0:
       print("n:", n)
       n -= 1
       time.sleep(1)


if __name__=='__main__':

    t = threading.Thread(target=demo, args=(10,))
    t.start()
    t.join()
    print("exit")

 

重寫run方法:

import time
import threading

class A(threading.Thread):
    def __init__(self, args):
        threading.Thread.__init__(self)
        self.args = args

    def run(self):
        n = self.args
        while n > 0:
            print("n:", n)
            n -= 1
            time.sleep(1)



if __name__=='__main__':

    t = A(10)
    t.start()
    t.join()
    print("exit")

 

創建后台線程:

t = threading.Thread(target=demo, args=(20,), daemon=True)
t.start()

------------------------------------------------------------

創建后台線程:

def f0():
    pass
 
def f1(a1,a2):
    time.sleep(5)
    f0()
 
'''下面代碼是直接運行下去的,不會等待函數里面設定的sleep'''
t= threading.Thread(target=f1,args=(111,112))#創建線程
t.setDaemon(True)#設置為后台線程,這里默認是False,設置為True之后則主線程不用等待子線程
t.start()#開啟線程

 

import time
import threading


def run(n):
    print('[%s]------running----\n' % n)
    time.sleep(2)
    print('--done--')


def thread1():
    print('starting thread: %s' % threading.current_thread().getName())
    for i in range(5):
        t = threading.Thread(target=run, args=[i, ])
        t.start()
        t.join(1)



print("start thread %s" % threading.current_thread().getName())
m = threading.Thread(target=thread1, args=(), name="thread1")
m.setDaemon(True)  # thread1,它做為程序主線程的守護線程,當主線程退出時,thread1線程也會退出,由thread1啟動的其它子線程會同時退出,不管是否執行完任務
m.start()
m.join(timeout=2)
print("---main thread done----")#主線程退出
Note:Daemon threads are abruptly stopped at shutdown. Their resources (such as open files, database transactions, etc.) may not be released properly.
If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event.

 

 ------------------------------
將類中的函數放在線程中執行,且能控制線程的結束
import time
import threading

class DownThread:
    def __init__(self):
        self._running = True

    def terminate(self):
        self._running = False

    def run(self, n):
        while self._running and n > 0:
            print('T-minus', n)
            n -= 1
            time.sleep(1)
  

if __name__=='__main__':


    c = DownThread()
    t = threading.Thread(target=c.run, args=(10,))
    t.start()
    time.sleep(3)
    c.terminate()
    t.join()

 Python多線程里面的event方法實現線程間通信

Python 通過threading.Event()產生一個event對象。Event默認內置了一個標志,初始值為False,通過set()將其置為True。wait(timeout)則用於堵塞線程直至Flag被set(或者超時,可選的),isSet()用於查詢標志位是否為True,

Clear()則用於清除標志位(使之為False)。

 當Event對象的內部信號標志為False時。wait方法一直堵塞線程等待到其為真或者超時(若提供,浮點數,單位為秒)才返回,若Event對象內部標志為True則wait()方法馬上返回。

def do(event):
    print('start')
    event.wait()
    print('end')

if __name__ == "__main__":
    event_obj = threading.Event()  # 創建一個事件
    event_obj.clear()

    t1 = threading.Thread(target=do, args=(event_obj,))
    t1.start()

    data = input('請輸入要:')
    if data == 'True':
        event_obj.set()  # 變綠燈

    time.sleep(5)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM