精华内容
下载资源
问答
  • Python的线程join()方法

    千次阅读 2018-01-02 09:43:27
    1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样 2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,...

    几个事实

    1 python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

    2 如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

    3 join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

    4 如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束。

    5 如果线程daemon属性为True, 则join里的timeout参数是有效的, 主线程会等待timeout时间后,结束子线程。此处有一个坑,即如果同时有N个子线程join(timeout),那么实际上主线程会等待的超时时间最长为 N * timeout, 因为每个子线程的超时开始时刻是上一个子线程超时结束的时刻。

    ps:

    1.主进程会等待所有子进程结束后才会程序结束

    2.主线程也会等待所有子线程结束后才会主线程结束

    3.from multiprocessing import Pool这个进程池,并不会等待所有的进程运行完成,而是主线程代码执行完成后程序就立即结束 .

    所以这个进程池需要加p.close()和p.join()

    4.from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor  的进程池和线程池,主进程或者主线程会等进程池内或者线程 池内的任务运行完成,整 个程序才会结速

    5.协程的问题,所有协程,主线程必须加join()阻塞,否则其他协程不运行.

    6.关于守护进程的问题,守护进程是在主进程的代码结束后,立刻结束.守护线程是在所有子线程都结束后,守护线程结束.

     

    测试代码和运行结果:

     

    [python] view plain copy

    1. import threading, time    
    2. def doThreadTest():    
    3.     print 'start thread time:', time.strftime('%H:%M:%S')    
    4.     time.sleep(10)    
    5.     print 'stop thread time:', time.strftime('%H:%M:%S')    
    6.   
    7. threads = []  
    8. for i in range(3):  
    9.     thread1 = threading.Thread(target = doThreadTest)    
    10.     thread1.setDaemon(True)  
    11.   
    12.     threads.append(thread1)  
    13.    
    14. for t in threads:  
    15.     t.start()   
    16.   
    17.   
    18. for t in threads:  
    19.     t.join(1)  
    20. print 'stop main thread'   


     

     

     

     

    如果把    thread1.setDaemon(True) 注释掉, 运行结果为

    展开全文
  • 如何杀死一个python的线程

    万次阅读 2017-10-04 16:45:42
    不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到bug。 话虽然这样说,但是有时候就有这样需求,...

    “不要试图用强制方法杀掉一个python线程,这从服务设计上就存在不合理性。 多线程本用来任务的协作并发,如果你使用强制手段干掉线程,那么很大几率出现意想不到的bug。”

    话虽然这样说,但是有时候就有这样的需求,可以python本身没有提供这样的API,所以没办法在网上找了一圈,发现了两种方法。如下:

    方法一:

    利用setDaemon(True)这个函数的特性,特性如下:主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出。

    但是如果要做到主线程不结束,但还是要强行结束子线程。所以我就突发奇想,如果我把要杀死的子线程看做是孙线程,给一个标志位给子线程,主线程改变标志位,子线程检查到就break自己,这样孙线程不就结束了,主线程仍在运行。然而,想法很美好。。。先上代码。

    import threading
    
    flag = 0
    # 为线程定义一个函数
    def print_time():
       def printOne():
          while 1:
             print(111111111111)
             print(222222222222)
             print(333333333333)
             print(444444444444)
             print(555555555555)
             print(666666666666)
       th1 = threading.Thread(target=printOne)
       th1.setDaemon(True)
       th1.start()
       while 1:
          if flag:
             print("正在停止这个程序!!!")
             break
    i=5
    if i == 5:
          th = threading.Thread(target=print_time)
          th.start()
          flag=1
          th.join()
          print("++++++++++++++++++++++++++++++++++++++++++++++++++")
    while 1:
       pass
    

    执行代码,会发现孙线程并没有结束。很简单,因为孙线程它会等主线程结束,它才结束。去掉最后两行代码,孙线程就会结束,但这也是等主线程结束的。所以方法一不满足需求。

    方法二:

    使用ctypes强行杀掉线程。

    import threading
    import time
    import inspect
    import ctypes
    
    def _async_raise(tid, exctype):
        """raises the exception, performs cleanup if needed"""
        tid = ctypes.c_long(tid)
        if not inspect.isclass(exctype):
            exctype = type(exctype)
        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
        if res == 0:
            raise ValueError("invalid thread id")
        elif res != 1:
            # """if it returns a number greater than one, you're in trouble,
            # and you should call it again with exc=NULL to revert the effect"""
            ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
            raise SystemError("PyThreadState_SetAsyncExc failed")
    
    def stop_thread(thread):
        _async_raise(thread.ident, SystemExit)
    
    def print_time():
        while 2:
             print(111111111111)
             print(222222222222)
             print(333333333333)
             print(444444444444)
             print(555555555555)
             print(666666666666)
    
    
    if __name__ == "__main__":
        t = threading.Thread(target=print_time)
        t.start()
    
        stop_thread(t)
        print("stoped")
        while 1:
            pass
    这个方法是在网上找的,推荐一下,非常干净利索的干掉了子线程。

    展开全文
  • GIL全局锁是:Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL.每个线程在执行过程都需要先...在python中,虽然其中有threading模块,也可以进行调用,但创造出来线程...

    GIL全局锁是:Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL.每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。作用就是保证同一时刻只有一个线程可以执行代码,造成了我们使用多线程的时候无法实现并行.

     

    关于多线程:

    在python中,虽然其中有threading模块,也可以进行调用,但创造出来的多线程并不是真正意义上的多线程.

    因为就算使用了多线程模式,也不能实现并发的效果,这就是因为有一个全局GIL锁,这个锁的意义就是同一时间内,保证真正执行的线程只有一个,只有进行IO操作阻塞的时候可能引起阻塞的system call之前可以暂时释放GIL,但在执行完毕后,必须重新获取GIL锁.

    在使用多线程的时候,多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁,类似于协程.

    结论:

            1. 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快
            2. 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程

     

    GIL锁的解决方法:

        1:更换解释器 比如使用jpython(java实现的python解释器),python默认的解释器是Cpython虚拟机.
        2:使用多进程完成多任务的处理

    展开全文
  • 通常的python的singleton写法是进程内唯一,即进程内的所有线程共享一个单例。例如 def singleton(cls): """ decorator for singleton """ instances = {} def _singleton(*args, **kw): if cls not in ...

    通常的python的singleton写法是进程内唯一,即进程内的所有线程共享一个单例。例如

    def singleton(cls):  
        """ decorator for singleton """
        instances = {}  
        def _singleton(*args, **kw):  
            if cls not in instances:  
                instances[cls] = cls(*args, **kw)  
            return instances[cls]  
        return _singleton

    但项目中我们往往需要更细颗粒度的Singleton,比如一个进程中有多个worker线程,但每个线程都希望有自己的线程内单独Singleton对象,其他线程也独立操作自己的线程内Singleton,所谓的线程级Singleton,其实他的实例总数 = 1(每个线程内部唯一的一个) * N (线程数)= N。

    import thread
    
    def thread_singleton(cls):  
        """ thread specific singleton """
        instances = {}  
        def _singleton(*args, **kw):  
            t_ident = thread.get_ident()
            if cls not in instances:  
                instances[cls] = {}
                instances[cls][t_ident] = cls(*args, **kw)
            elif t_ident not in instances[cls]:
                instances[cls][t_ident] = cls(*args, **kw)
            return instances[cls][t_ident]
        return _singleton


    展开全文
  • python的线程锁机制

    千次阅读 2012-09-20 15:29:45
    线程与锁 ...请求锁定 -- 进入锁定池等待 -- 获取锁 --- 已锁定 --- ...Lock处于锁定状态时,不被特定的线程拥有。...可以认为Lock有一个锁定池,当线程请求锁定时,将线程至于池中,直到...池中的线程处于状态图中的
  • 关于Python的线程

    千次阅读 2006-03-01 11:26:00
    Python中如果要使用线程的话,python的lib中提供了两种方式。 一种是函数式, 一种是用类来包装的线程对象。 举两个简单的例子希望起到抛砖引玉的作用,关于多线程编程的其他知识例如互斥、信号量、临界区等请...
  • Python的线程/进程间通讯对象分析

    千次阅读 2016-06-26 15:49:08
    Python提供了一系列对象支持线程/进程间通讯: Lock RLock Condition Semaphone BounderSemaphone Event Barrier 除了Lock,Rlock外,进程相关对象只是线程相关对象clone,而且进程Lock,RLock也是与线程...
  • Python 标准库提供了 thread 和 threading 两个模块来对多线程进行支持。其中, thread 模块以低级、原始方式来处理和控制线程,而 threading 模块通过对 thread 进行二次封装,提供了更方便 api ...
  • Hello,我是Python里面的线程,今天我就来向大家做个自我介绍吧!首先,我想说的是,我(线程)不只是在python中会出现,我在任何编程语言中都可以使用代码将我实现...
  • python线程详解(超详细)

    万次阅读 多人点赞 2019-09-28 08:33:31
    python线程是一个非常重要知识点,今天为大家对多线程进行详细说明,代码中注释有多线程的知识点还有测试用实例。 import threading from threading import Lock,Thread import time,os ''' python...
  • 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。Python的标准库提供了两个模块:thread和...
  • python线程教程:python线程详解

    千次阅读 2020-02-03 11:49:20
    文章目录一、线程介绍二...python线程详解 一、线程介绍 什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度最小单位,它被包涵在进程之中,是进程中实际运作单位。线程自己不拥有系统资源...
  • 获取Python线程的返回值

    万次阅读 2018-04-21 18:39:43
    python线程时,遇到需要获取每个线程返回值问题,经查资料学习总结如下:Python中使用线程有两种方式:用方法包装线程和用类包装线程方法一、用方法包装线程thread.start_new_thread ( function, args[, ...
  • Python线程 SQLite

    千次阅读 2018-08-15 17:07:35
    由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。 Python的标准库提供了两个模块:_thread和...
  • Python线程

    2015-12-01 20:59:35
    由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。 Python的标准库提供了两个模块:thread和...
  • python线程

    千次阅读 2019-10-12 11:20:59
    python多线程及notify和wait的是使用python多线程线程...python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。但是python由于GIL(global interpreter l...
  • 线程,简单理解一下话可以是多核/多机器/多副本同时运行,对于可并行处理数据,(理想情况下)4线程可以把效率提高4倍。 实例说话 import threading def thread_job(): # 可以分配给线程的工作(函数) ...
  • 参考别人:...重写Thread线程类参考官方文档:https://docs.python.org/zh-cn/3/library/threading.html#module-threading 我自己写代码: """ 功能:封装一个自定...
  • Python线程

    2019-11-28 23:08:07
    本课程主要讲解使用Python_thread和threading模块实现多线程编程,以及队列Queue使用。课程中使用队列实现了生产者和消费者程序编写。 重点:_thread和threading、Queue
  • Python结束线程的方法

    千次阅读 2016-09-28 08:48:26
    Python结束线程的方法
  • 我们进行程序开发时候,肯定避免不了要...Python 提供多线程编程方式。 本文基于 Python3 讲解,Python 实现多线程编程需要借助于 threading 模块。 所以,我们要在代码中引用它。 import threading thread...
  • python线程爬取某网站全部H漫画

    万次阅读 多人点赞 2020-02-09 05:27:13
    python线程爬取某网站全部h漫画 首发于个人博客:https://gunnerx.github.io/ 前言 最近学习python线程与爬虫相关知识,想试着练练手。正好想到常逛一个正(se)经(qing)漫画网站,决定想办法把上面全部漫画都...
  • 在使用多线程的过程中,我们知道,python的线程是没有stop/terminate方法的,也就是说它被启动后,你无法再主动去退出它,除非主进程退出了,注意,是主进程,不是线程的父进程. 一个比较合理的方式就是把原因需要放到...
  • Python线程的退出控制

    万次阅读 多人点赞 2019-06-15 14:34:03
    Python线程的退出控制 日常前言 最近接 到一个抢票爬虫外包,那个网站及其之捞,访问购票地址竟然还要排队,在购票高峰临时升一下服务器配置不行吗…没办法,甲方爸爸要求还得做啊,其中一个障碍便是目标...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,492
精华内容 12,996
关键字:

python的线程

python 订阅