一文带你掌握Python中多线程和线程池的使用方法

大家好,今天我们来聊聊Python中的多线程和线程池。
这两个对于Python来说并不陌生,但是如果使用得当,它们可以使你的程序变得非常快。

关于第一个多层的寓言。
显然,这是同时实现多个目的的问题。
Python 线程模块执行此操作。
比如我之前写了一个简单的函数,数字从1 到5 :
python def 任务; print(f'任务{num}正在运行。
')
然后我用shell的主程序创建了5 个线程:
python 如果 __name__ == '__main__': 相关 = [] 对于范围 (5 ) 内的 i; t = threading.Thread(目标 = 任务, args = (i)) t.start() 线程.append(t) 对于 t 线; t.join()
这样,程序可以同时运行 1 到 5 个打印作业。
不过,多线程有几点需要注意:比如执行顺序的顺序是不确定的,而且由于GIL(全局解释器锁)的存在,每次只有一个线程执行Python字节码。

接下来是线槽。
这个东西就像一个自动线程管理器。
您不必一直手动创建和删除线程,它会为您处理这些事情。
有一个并发ThreadPoolExecutor。
未来的Python模块,用它来创建一个池序列:
python. def 任务; print(f'Task{num}isrunning.')
if __name__ == '__main__': 当 concurrent.futures.ThreadPoolExecutor (max_workers = 3 ) 作为执行器时: future = [executor.submit(nego, i) for i in range(5 )] 并发.futures.wait
这里,max_操作符参数设置线程池中的最大线程数。
使用这种方法的好处是可以返回线程,减少创建和销毁的开销。

接下来我们谈谈实际应用。
例如,当我以前处理大量数据时,我发现一个线程非常慢。
后来改用多线程,速度提高了很多。
再比如,我以前剥离总共2 5 0部豆瓣电影的数据时,也是用一个线程,速度慢得要哭。
后来使用了坦克线,爬行速度提高了好几倍。

最后,通过选择和使用,多线程或者线程池适合网络请求、数据包操作等I/O密集型任务。
如果任务是 CPU 密集型任务,则可以使用多个处理器。
使用池中的线程来完成简单的任务非常方便。
对于更复杂的任务,多重折叠更加灵活。

需要注意的是,分享信息时一定要注意顺序,使用逗号;异常处理一定要做好,异常不影响其他线程;资源有限,不要有太多线程挂机;另外,GIL的存在,多阶段Python不适合纯CPU计算。

总之,使用多线程和线程池可以极大地提高你的Python编程性能。
但这也不是万能的,使用时要根据自己的需要来判断。

线程池创建的四种方法是什么

哎呀,这就是Java线程池。
刚刚接手一个项目,由于线程池没有调整,服务器崩溃了。
给大家讲一下我的踩坑经历吧。

那年公司接到一个大订单,客户要求系统能够承受1 0万个并发请求。
作为初学者,我创建了一个newFixedThreadPool(1 00),认为线程数足够了就稳定了。
结果呢?服务器CPU直接飙升到2 00%,内存溢出。
经过检查发现是任务队列没有上限,后端处理不了。
所有的任务都堆在那里。
新的请求会创建新的线程,最终系统崩溃。
那场面实在是太刺激了。

后来发现newFixedThreadPool的队列是没有限制的。
如果指定 1 00 个线程,则任务队列的大小没有限制。
如果任务太多,就会为新任务创建新线程,最终导致内存溢出。
我当时就后悔得肠子都绿了。

后来我改用newCachedThreadPool。
该线程池是可缓存的,空闲线程在 6 0 秒内被回收。
如果提交新任务时没有回收线程,则创建一个新线程。
这个很灵活,但是你必须控制任务的数量。
否则,如果任务过多,线程就会无休止地增长,最终导致资源耗尽。
这适用于高并发的短期任务,例如HTTP请求处理。
后来我用它来处理用户登录请求,性能还可以,但还是要时刻关注任务数量,不能让它跑掉。

对于newSingleThreadExecutor,这是单线程的,并确保任务按顺序执行。
我用它来处理日志写入,它保证了顺序,但是后来我发现如果这个线程挂了,它会自动创建一个新的线程来替换它,这会导致任务重复执行。
所以这个要谨慎使用,以保证线程的稳定性。

最后,还有newScheduledThreadPool,它支持计划任务和周期性任务。
我用它定期同步数据,效果非常好,并且可以精确控制执行时间。

一般来说,这四种线程池都有各自的相关场景,但是需要注意配置参数,尤其是队列大小和线程数量。
在实际开发中,我建议通过ThreadPoolExecutor手动配置参数,以避免使用Executor的工厂方法的默认配置。
你和我必须偶然发现可能由该事物的默认配置引起的资源问题。

顺便记住,当线程池用完后,必须调用shutdown()来释放资源。
否则,资源将一直被占用,服务器最终将无法运行。
这次教训我真是难忘。

创建线程推荐使用哪些方法

有几种推荐的方法来创建主题。

1 .实现Runnable接口 这个技巧很常见。
为什么?在Java中,一个类只能继承一个父类。
如果它继承Thread类那就麻烦了。
例如,如果你有一个继承了其他类的类,而你现在想使用Thread,那么它就行不通。
但实现 Runnable 接口则不同。
一个类可以灵活地实现多个接口。
你只需要定义一个类,实现Runnable,重写run方法并在其中写下你想要做的事情。
然后将类实例传递给 Thread 构造函数来创建线程。
这种方式是面向对象的,代码复用性高,所以推荐使用。

2 实现可调用接口 这个技巧类似于 Runnable,但它可以返回值并抛出异常。
例如,如果你想计算一些东西,你需要计算后的结果,并且你必须处理可能的错误情况,这就是 Callable 非常有用的地方。
只需要实现Callable,重写调用方法,编写计算逻辑,返回结果即可。
然后用FutureTask包装并传递给Thread。
最后使用FutureTask的get方法获取结果。
当需要结果或需要处理异常时使用此技巧。

3 线程池(不是Executor创建的) 这种方法可以很好的管理线程,避免旧的创建和旧的销毁丢失。
然而,用Executor创建的线程池有缺陷。
如果参数控制不好,资源可能会耗尽。
所以不要使用执行器。
您应该使用 ThreadPoolExecutor 自己构建它。
可以设置核心线程数、最大线程数、空闲时间等,这样可以更好的控制线程池,提高系统性能和稳定性。

java创建线程池有哪几种方式? 为何搜索到的都是说4种

1 .固定线程池:适合稳定且避免OOM的任务,例如电商订单处理。
2 、弹性线程池:短期任务较多,比如日志收集,但风险较高。
3 、单线程池:顺序执行,比如单例初始化。
4 、定时任务池:比如定时数据库备份。
5 . ForkJoinPool:分而治之任务,比如处理大文件。
6 . Spring Integration:像Web应用程序一样,易于管理。
你自己掂量一下吧。