Python的并发并行[4] -> 并发 -> 利用线程池启动线程

利用线程池启动线程



submitmap启动线程

利用两种方式分别启动线程,同时利用with上下文管理来对线程池进行控制

 1 from concurrent.futures import ThreadPoolExecutor as tpe
 2 from concurrent.futures import ProcessPoolExecutor as ppe
 3 from time import ctime, sleep
 4 from random import randint
 5
 6 def foo(x, name):
 7     print(‘%s%d starting at‘ % (name, x), ctime())
 8     sleep(randint(1, 7))
 9     print(‘%s%d completed at‘ % (name, x), ctime())
10
11 # Use submit function
12 print(‘-----Using submit function-----‘)
13 #executor = tpe(7)
14 #with executor:
15 with tpe(7) as executor:
16     for i in range(5):
17         executor.submit(foo, i, ‘No.‘)
18
19 # Use map function
20 print(‘-----Using map function-----‘)
21 with tpe(7) as executor:
22     executor.map(foo, range(5), [‘No_a.‘, ‘No_b.‘, ‘No_c.‘, ‘No_d.‘, ‘No_e.‘])
23
24 # TODO: Learn more about ProcessPoolExecutor
25 """
26 with ppe(2) as executor:
27     executor.submit(foo, 1, ‘No.‘)
28 """

定义foo方法,并运用两种方式启动线程池执行器,其中with tpe(7) as executor语句等价于executor = tpe(), with executor,with的上下文管理可以保证执行器在所有submit的foo函数完成之前挂起等待。

运行得到结果

-----Using submit function-----
No.0 starting at Wed Aug  2 14:33:06 2017
No.1 starting at Wed Aug  2 14:33:06 2017
No.2 starting at Wed Aug  2 14:33:06 2017
No.3 starting at Wed Aug  2 14:33:06 2017
No.4 starting at Wed Aug  2 14:33:06 2017
No.2 completed at Wed Aug  2 14:33:07 2017
No.0 completed at Wed Aug  2 14:33:08 2017
No.3 completed at Wed Aug  2 14:33:08 2017
No.1 completed at Wed Aug  2 14:33:09 2017
No.4 completed at Wed Aug  2 14:33:13 2017
-----Using map function-----
No_a.0 starting at Wed Aug  2 14:33:13 2017
No_b.1 starting at Wed Aug  2 14:33:13 2017
No_c.2 starting at Wed Aug  2 14:33:13 2017
No_d.3 starting at Wed Aug  2 14:33:13 2017
No_e.4 starting at Wed Aug  2 14:33:13 2017
No_b.1 completed at Wed Aug  2 14:33:14 2017
No_c.2 completed at Wed Aug  2 14:33:14 2017
No_d.3 completed at Wed Aug  2 14:33:14 2017
No_a.0 completed at Wed Aug  2 14:33:18 2017
No_e.4 completed at Wed Aug  2 14:33:18 2017  

查看结果可以看出,两者效果相近。

未完待续...

相关阅读



1. concurrent.future 模块

原文地址:https://www.cnblogs.com/stacklike/p/8167128.html

时间: 2024-10-13 19:28:43

Python的并发并行[4] -> 并发 -> 利用线程池启动线程的相关文章

由浅入深理解Java线程池及线程池的如何使用

前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory.即便没有这样的情况,大量的线程回收也会给GC带来很大的压力. 为了避免重复的创建线程,线程池的出现可以让线程进行复用.通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用. 接下来从总体到细致的方式,来共同探讨线程池. 总体的架构

线程系列06,通过CLR代码查看线程池及其线程

在"线程系列04,传递数据给线程,线程命名,线程异常处理,线程池"中,我们已经知道,每个进程都有一个线程池.可以通过TPL,ThreadPool.QueueUserWorkItem,委托与线程池交互.本篇体验:通过查看CLR代码来观察线程池及其线程. □ 通过编码查看线程池和线程 使用ThreadPool的静态方法QueueUserWorkItem把线程放入线程池,来看线程池线程和主程序线程的执行情况. class Program { static void Main(string[]

线程池和线程的选择

能用线程池就用线程池,线程池效率比线程高很多. 线程池处理线程的顺序不一定. 线程池不能手动关闭具体线程. 如果执行线程时间特别长,那手动创建线程,和放入线程池中没太大区别. 线程池非常适合做大量的小的运算.

多线程 线程池 守护线程

守护线程只是个概念问题,一句话可以总结(不知道总结的对不对^_^); 当所有用户线程都结束的时候,守护线程也就结束了,当有用户线程存在的时候,守护线程就是一个普通线程. main线程不可以设置成守护线程,应为只有在线程调用start方法前,才可以设置线程为守护线程,main线程是jvm创建的 多线程以及线程池的问题 import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; impor

通过实验研究“线程池中线程数目的变化规律” --- 下有不错的线程池使用 原理 总结

通过实验研究“线程池中线程数目的变化规律” 自从看了老赵关于线程池的实验以后,我就想学着做一个类似的实验,验证自己的理解,现在终于做好了,请大家指正. 一般情况下我们都使用Thread类创建线程,因为通过Thread对象可以对线程进行灵活的控制.但创建线程和销毁线程代价不菲,过多的线程会消耗掉大量的内存和CPU资源,假如某段时间内突然爆发了100个短小的线程,创建和销毁这些线程就会消耗很多时间,可能比线程本身运行的时间还长.为了改善这种状况,.NET提供了一种称之为线程池(Thread Pool

Java多线程系列 JUC线程池07 线程池原理解析(六)

 关闭“线程池” shutdown()的源码如下: public void shutdown() { final ReentrantLock mainLock = this.mainLock; // 获取锁 mainLock.lock(); try { // 检查终止线程池的“线程”是否有权限. checkShutdownAccess(); // 设置线程池的状态为关闭状态. advanceRunState(SHUTDOWN); // 中断线程池中空闲的线程. interruptIdleWork

python全栈脱产第37天------进程池与线程池、协程、gevent模块、单线程下实现并发的套接字通信

一.进程池与线程池 调用concurrent.futures下的ThreadPoolExecutor,ProcessPoolExecutor来实现 提交任务有两种方式:同步调用:提交完一个任务之后,就在原地等待,等待任务完完整整地运行完毕拿到结果后,在执行下一段代码,是串行的 异步调用:提交完一个任务之后,不在原地等待,直接运行下一段代码,任务是并发的 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutorimp

Java并发(八)计算线程池最佳线程数

目录 一.理论分析 二.实际应用 为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务.并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行.在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) . 但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程.那么在高

C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定

思路来源:http://bbs.csdn.NET/topics/390819824,引用该页面某网友提供的方法. 题目:我现在有100个任务,需要多线程去完成,但是要限定同时并发数量不能超过5个. 原理:初始启用5个线程,然后让线程中的过程执行完毕之后,自己去取下一个任务,启动下一个线程. [csharp] view plain copy print? public class MyTaskList { public List<Action> Tasks = new List<Actio