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)
     
  • 相关阅读:
    使群辉支持NTFS(未完善)
    docker 解决 Dockerfile同级文件有其他文件 导致docker build包越来越大
    nginx location配置前后端地址
    前端 Umi框架自带的proxy功能请求后端地址
    linux常用命令
    arthas的使用(正常部署+服务docker部署)
    linux
    oracle行转列,列转行函数的使用(listagg,xmlagg)
    oracle 使用函数 ROW_NUMBER() OVER(PARTITION BY 列 ORDER BY 列 排序 ),自关联日志表,将列数据转换为 行数据
    oracle merge into用法
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/9264791.html
Copyright © 2011-2022 走看看