zoukankan      html  css  js  c++  java
  • 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)
        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)
     
  • 相关阅读:
    vue环境搭建
    'vue' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    文件上传
    json字符串解析为java对象
    自定义登录控制类Demo
    分页后台代码Demo
    主键回显
    angularjs变量的三种表示方式
    js往后台传参的方式
    同一路径下jsp能访问到,html不能访问到
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/9264791.html
Copyright © 2011-2022 走看看