您的位置:

python线程池setdaemon,python线程池原理

本文目录一览:

python如何实现线程池

#这个类是线程类,用来在主程序中调用生成一个线程。其实线程池就是线程的集合地,

#能够解决有效统一的管理线程,基本就达到了线程池的目的;

#这一段代码是我的爬虫程序中的一部分,希望对你有用。

class Spider(Thread):

    def __init__(self, todo_list):

        super().__init__()

        self.setDaemon(True)

        self.todo_list = todo_list

        self.stat = IDLE

    def is_idle(self):

        return self.stat == IDLE

    def run(self):

        while True:

            url = self.todo_list.get()

            # 开始线程工作

            

#这个函数就是主函数了,            

def main(max_threads):

    ########这里和上一个函数就是核心代码了。

    # 创建 N 个线程,并启动

    print('Spawn spiders')

    spiders = [Spider(todo_list) for i in range(max_threads)]

    for spd in spiders:

        spd.start()

  

#python主运行代码:            

if __name__ == '__main__':

        main(max_threads)

只能给你这么多解释了,如果想弄懂,还是要去看看基础知识的。

另外可以查一下有没有封装好的三方库。

python的多线程使用setDaemon有什么意义

因为python的全局解释器锁的机制, 导致python的多线程并不是真正的多线程, 效率上不仅不会比单线程快,反而可能更慢, 所以说是鸡肋,要求速度好话,可以用多进程来实现

Python中threading的join和setDaemon的区别及用法

Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下:

join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

setDaemon,将该线程标记为守护线程或用户线程

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。

原型:join([timeout]),里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('线程结束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.start() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497534590.2784667

主线程打印开始:1497534590.2794669

1

2

3

4

主线程打印结束:1497534592.279581

999

线程结束:1497534600.2800388

从打印结果可知,线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是在线程执行的同时,执行了后面的语句。

现在,把join()方法加到启动线程后面(其他代码不变)

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('线程结束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.start() t1.join() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497535176.5019968

999

线程结束:1497535186.5025687

主线程打印开始:1497535186.5025687

1

2

3

4

主线程打印结束:1497535188.5026832

线程t1 start后,主线程停在了join()方法处,等子线程t1结束后,主线程继续执行join后面的语句。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置。import threading

import time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print("This is:" + self.getName()) # 获取线程名称 print('线程结束:' + str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.setDaemon(True) t1.start() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497536678.8509264

主线程打印开始:1497536678.8509264

1

2

3

4

主线程打印结束:1497536680.8510408

t1.setDaemon(True)的操作,将子线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。

如果在线程启动前没有加t1.setDaemon(True),输出结果为:

线程开始:1497536865.3215919

主线程打印开始:1497536865.3215919

1

2

3

4

主线程打印结束:1497536867.3217063

999

This is:Thread-1

线程结束:1497536875.3221638

程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成,如果子线程未完成,则主线程会等待子线程完成后再退出;

有时我们需要的是,子线程运行完,才继续运行主线程,这时就可以用join方法(在线程启动后面);

但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法(在线程启动前面)。

python之多线程原理

并发:逻辑上具备同时处理多个任务的能力。

并行:物理上在同一时刻执行多个并发任务。

举例:开个QQ,开了一个进程,开了微信,开了一个进程。在QQ这个进程里面,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。

总结:开一个软件,相当于开了一个进程。在这个软件运行的过程里,多个工作同时运转,完成了QQ的运行,那么这个多个工作分别有多个线程。

线程和进程之间的区别:

进程在python中的使用,对模块threading进行操作,调用的这个三方库。可以通过 help(threading) 了解其中的方法、变量使用情况。也可以使用 dir(threading) 查看目录结构。

current_thread_num = threading.active_count() # 返回正在运行的线程数量

run_thread_len = len(threading.enumerate()) # 返回正在运行的线程数量

run_thread_list = threading.enumerate() # 返回当前运行线程的列表

t1=threading.Thread(target=dance) #创建两个子线程,参数传递为函数名

t1.setDaemon(True) # 设置守护进程,守护进程:主线程结束时自动退出子线程。

t1.start() # 启动子线程

t1.join() # 等待进程结束 exit()`# 主线程退出,t1子线程设置了守护进程,会自动退出。其他子线程会继续执行。