Python多线程编程之线程结束

线程管理包括创建线程、启动线程、挂起线程、等待线程结束、停止线程。
线程的创建、线程的启动、线程的挂起前面已经提到过,这里不再赘述。

1等待线程结束

等待线程结束使用join()方法当前线程调用线程t1的join()方法时,会阻塞当前进程,等待线程t1结束。
如果线程t1终止或等待到期,则当前线程返回活动状态并继续执行。
join()方法的语法如下:

join(timeout=None)

timeout参数用于设置超时时间,单位为s。
如果不设置超时,则可以永远等待

当一个线程依赖于另一个线程的执行结果时,可以调用另一个线程的join()方法并等待其完成

示例:

importthreadingimporttimeshared_value=0defthread_body():globalshared_valueprint('ThreadA开始...')for_inrange(5):print('ThreadA正在运行...')share_value+=1time.sleep(1)print('ThreadA结束....')defmain():print("主线程开始...")t1=threading.Thread(target=thread_body,name='ThreadA')t1.start()print('主线程被阻塞...')t1.join()print(f'value={shared_value}')print('主线程继续运行...')

结果:

主线程启动...ThreadA启动...主线程被阻塞Stop...ThreadA正在运行...ThreadAis正在运行...ThreadA正在运行...ThreadA正在运行...ThreadA正在运行.....ThreadA终止...value=5主线程继续运行...

这里设置了一个共享变量shared_value,并在body中更改了该变量的线程。
在main函数中调用t1的join()方法会导致主线程阻塞,等待线程t1执行完毕后,主线程才会继续执行。
从结果来看,主线程丢失并阻塞,打印的shared_value从0变成了5

2个线程停止

​​对于一些复杂的任务,需要设置一个线程停止变量来确定线程停止。
例如,有一个系统捕获数据,每半小时运行一次数据捕获任务。
数据扫描任务通常在辅助线程中执行,并在执行前休眠一段时间。
这个子线程在中国会无限循环。
要停止子线程,需要设置一个线程kill变量

示例:

importthreadingimporttimeis_running=Truedefthread_body():thinkis_running:print('ThreadAopens...')#数据捕获任务print('ThreadA正在执行...')time.sleep(1)print('ThreadA正在终止...')print('整个程序执行完毕')defmain():print('主线程开始...')t1=threading.Thread(destination=thread_body)t1.start()command=input('输入停止命令:')ifcommand=='退出':globalis_runningis_running=Falseif__name__=='__main__':main()

结果:

主线程启动.......ThreadA启动...ThreadA正在运行...输入停止命令:exitThreadA退出...整个程序执行完成

这里设置了一个线程变量stopis_running,默认值为True当用户通过键盘在控制台输入exit时,其值变为False,程序结束。
需要注意的是,在控制台输入exit后,仍然需要按回车键。

「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!

随着程序复杂度和数据量的不断增长,同步编程模型的性能瓶颈越来越显着,异步编程作为提高竞争性能和资源使用效率的解决方案应运而生。
Python的concurrent.futures模块作为异步编程的强大工具,简化了并发编程的实现,并提供了一组易于使用的接口来帮助开发人员轻松地进行并发编程。
面对Python爬虫等需要控制并发执行线程数量的场景,单纯创建大量线程并不能有效解决问题。
创建和销毁大量线程会消耗系统资源,并且并发运行的线程数量受到系统并发度的限制。
使用线程池可以有效解决这个问题。
通过限制线程池中的线程数量,线程可以共享任务队列,实现高效的任务调度和执行。
编写线程池需要考虑复杂的线程同步问题,而Python3.2中引入的concurrent.futures模块通过提供两个类:ThreadPoolExecutor和ProcessPoolExecutor,简化了异步编程的实现。
这些类不仅可以自动调度线程,还可以解决上述问题,为开发人员提供更高效、更易用的并发编程解决方案。
ThreadPoolExecutor和ProcessPoolExecutor两个类分别用于管理线程池和进程池。
线程池(ThreadPoolExecutor)适合运行大量轻量级任务,而进程池(ProcessPoolExecutor)适合计算密集型任务,可以充分利用多核处理器的资源。
使用这两个工具,开发人员可以更轻松地实现异步任务执行,提高程序响应速度和并发处理能力。
使用ThreadPoolExecutor和ProcessPoolExecutor,开发者只需专注于提交任务和获取结果。
通过“submit”方法提交作业,通过“map”方法运行批处理作业,并通过“shutdown”方法控制线程池生命周期。
Future对象作为任务的返回容器,用于管理任务的状态和结果,使得执行任务和获取结果的过程更加顺畅和高效。
在实际开发中,选择合适的并发执行方式至关重要。
concurrent.futures模块为Python提供了丰富的并发编程工具。
无论是线程池还是进程池,都可以根据具体的应用场景灵活选择,以达到性能和资源利用率的最优。
对于日常开发来说,比较常见的是使用线程池(ThreadPoolExecutor),它可以有效提高程序的并发处理能力,减少资源消耗,提高程序执行效率。
总而言之,concurrent.futures模块是一个重要的工具Python异步编程。
它简化了并发编程的实现,提供了丰富的API用于管理线程和进程,显着提高了程序的并发处理能力。
面对复杂的应用场景,合理使用该模块可以极大地提高程序性能和开发效率,为开发者提供强有力的技术支持。

python开多少线程合适的简单介绍

这篇文章会讲一下Python适合多少主题以及相应的知识点,希望对你有用,别忘了收藏本站。

本文目录:

1.Python创建多少个线程才能实现最佳执行效率?2、多线程Python爬虫可以使用多少个线程?3.Python可以支持多少个线程?4、多线程编程的线程数多少合适?Python创建多少个线程才能获得最佳执行效率?

由于python语言有GIL全局编译器锁,所以python中的多线程无法发挥多核的优势,不过,如果是IO密集型项目,多线程的效率也是非常好的爬虫。

多线程Python爬虫可以使用多少个线程

没有固定值,取决于达到你的爬行目标的速度。
设置服务器的速度(内存、CPU)。

如果您的问题已解决,请采纳!

如果问题没有解决,请继续追问!

Python支持多少个线程?

嗯,Python线程很慢,如果你想并发运行,使用Greenlet,它又快又容易写。

如果锁是synchronized的话,线程太多的话可能会变慢。

ulimit-s返回默认线程堆栈大小8192。
将其除以内存大小即可得到理论线程数。

多线程编程的线程数多少合适?

一般取决于CPU核心数。
并不是说开放得越多越好。
例如,在双核CPU中,如果两个线程(主线程和新创建的线程)就足够了,那么最好只打开两到四个线程。
如果开多了,速度可能会下降,因为切换线程的成本对于CPU来说太高了(自然切换操作就更贵了)。
一般来说,进程中的线程数是CPU核心数的1到2倍比较理想。

这就是提供要在Python中打开的适当数量的主题的全部内容。
感谢您花时间阅读本网站的内容。
有关在Python中打开的适当线程数的更多信息,请不要忘记搜索这个网站。