循环执行一个线程

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/7/20 0020 5:35
import threading
import queue
import time class my_th(threading.Thread): def __init__(self):
super().__init__()
self.daemon = True # 守护模型(主线程结束,所有子线程结束)
self.queue = queue.Queue() def run(self):
while True:
fun = self.queue.get() # 得到函数对象,
fun() # 运行函数
self.queue.task_done()
# 队列中有任务,会不断的依次运行, def appy(self,fun): # 添加任务
self.queue.put(fun) def join(self, timeout=None): # 重写 join 方法
self.queue.join() # 把队列的 join 方法写在里边
# 当队列任务执行完毕就结, def fun_1():
time.sleep(2)
print('aaaa') t = my_th()
t.start()
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1) t.join() # 这里的 join 不是等待线程,而是等待队列任务执行完 # 始终只有一个线程在运行,

上边是任务有多个,但线程池中只有一个线程,2秒打印一个,

自定义线程池

# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/7/20 0020 5:35
import threading
import queue
import time class my_th(threading.Thread): def __init__(self,num):
super().__init__()
self.queue = queue.Queue()
for i in range(1,num+1):
t = threading.Thread(target=self.run, name='thread_{}'.format(i))
t.daemon = True
t.start() def run(self):
while True:
fun = self.queue.get() # 得到函数对象,
fun() # 运行函数
self.queue.task_done()
# 队列中有任务,会不断的依次运行, def appy(self,fun): # 添加任务
self.queue.put(fun) def join(self, timeout=None): # 重写 join 方法
self.queue.join() # 把队列的 join 方法写在里边
# 当队列任务执行完毕就结, def fun_1():
time.sleep(2)
print('aaaa') t = my_th(5) # () 创建线程个数,
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1)
t.appy(fun_1) t.join() # 这里的 join 不是等待线程,而是等待队列任务执行完

  

进程池

# import multiprocessing
# from multiprocessing import Pool # py自带的进程池
import time
from multiprocessing.dummy import Pool # 线程池
from multiprocessing.pool import ThreadPool # 线程池 pool = Pool(4) # 实例池,他的大小默认是 cpu 核心个数 def func(i):
print('..............',i)
time.sleep(0.1) if __name__ == '__main__':
for i in range(10):
pool.apply_async(func=func,args=(i,)) # 向池提交任务 # pool.map(func,range(5)) # 与 pool.apply_async pool.close() # 关闭池
pool.join() # 等待任务完毕
  
  
  # pool.terminate()

 

如果池中有返回值:

# import multiprocessing
# from multiprocessing import Pool # py自带的进程池
import time
from multiprocessing.dummy import Pool # 线程池
from multiprocessing.pool import ThreadPool # 线程池 pool = Pool(4) # 实例池,他的大小默认是 cpu 核心个数 def func(i):
print('..............',i)
time.sleep(0.1)
return i if __name__ == '__main__':
a = []
for i in range(10):
p = pool.apply_async(func=func,args=(i,)) # 向池提交任务
a.append(p.get()) # pool.map(func,range(5)) # 与 pool.apply_async pool.close() # 关闭池
pool.join() # 等待任务完毕
for i in a:
print(i) # pool.terminate()

  

潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)

    #斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...

  2. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  3. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  9. Java并发编程之线程池及示例

    1.Executor 线程池顶级接口.定义方法,void execute(Runnable).方法是用于处理任务的一个服务方法.调用者提供Runnable 接口的实现,线程池通过线程执行这个 Runn ...

随机推荐

  1. kafka系列五、kafka常用java API

    引入maven包 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka- ...

  2. Android系统信息(内存、cpu、sd卡、电量、版本)获取

    Android系统信息(内存.cpu.sd卡.电量.版本)获取 /*APPInfo.java*/ public class AppInfo { private String appLable; pri ...

  3. Android命令Monkey压力测试,详解

    一.Monkey 是什么?Monkey 就是SDK中附带的一个工具. 二.Monkey 测试的目的?:该工具用于进行压力测试. 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出 ...

  4. sklearn.model_selection模块

    后续补代码 sklearn.model_selection模块的几个方法参数

  5. python-pandas 高级功能(通过学习kaggle案例总结)

    方法.iterrows()遍历循环df中的元素. for index,row in df.iterrows(): pass 更改df一个元素中的变量值. data1.set_value(index,' ...

  6. JQ初学总结一

    Jquery是最火的JavaScript库,大部分web开发都会用到就jquery,而作为初学者看了一些jq的用法总结自己的学习以增强自己的认知. 普通的javascript的缺点是:每种控件的操作方 ...

  7. C++11 AUTO 类型实践

    auto在C++11中引入,为大家带来方便. 具体使用及注意事项参考: https://blog.csdn.net/xiaoquantouer/article/details/51647865 htt ...

  8. concat layer

    参考:http://blog.csdn.net/bailufeiyan/article/details/50876728#reply

  9. Java+Jmeter接口测试

    一.创建工程.引包 1.创建JAVA工程 2.引入Jmeter中lib\ext基础包:ApacheJMeter_java.jar.ApacheJMeter_core.jar 3.引入Jmeter日志包 ...

  10. 树链剖分边权模板spoj375

    树链剖分是树分解成多条链来解决树上两点之间的路径上的问题 如何求出树链:第一次dfs求出树上每个结点的大小和深度和最大的儿子,第二次dfs就能将最大的儿子串起来并hash(映射)到线段树上(或者其他数 ...