循环执行一个线程

# -*- 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. Kernel 3.0.8 内存管理函数【转】

    转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_ma ...

  2. PhantomJSのメモいろいろ

    提供されるモジュール群は5つ phantom: そのもの FileSystem: ファイルに出力したり.依存ファイルの存在確認したり System: コマンドラインから引数取りたいなら WebPage ...

  3. C/C++:.hpp与.h区别

    原文地址:http://blog.csdn.net/f_zyj/article/details/51735416 .hpp,本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件, ...

  4. windows系统下安装tomcat及配置

    1.安装测试 1.安装 推荐使用免安装版的Tomcat(放在没有中文和空格的目录下),前提是已经安装了JDK并配置了环境变量. 2.测试 双击startup.bat,浏览器输入url:localhos ...

  5. 提高delete效率方法

    1 open c_1;   loop     fetch c_1 bulk collect       into t2 limit 100000;     exit when c_1%notfound ...

  6. 005_awk案例实战

    一.工作经验总结. (1)日志案例: 10.100.194.39 10.100.194.39 1019-03-16T11:01:04+08:00 www.uuwatch.com^^3FF91DE01B ...

  7. js 将图片连接转换称base64格式

    我们把图像文件的内容直接写在了HTML 文件中,这样做的好处是,节省了一个HTTP 请求.坏处呢,就是浏览器不会缓存这种图像.现在我们提供一个js: function convertImgToBase ...

  8. 转载:《RESTful API 设计指南》 阮一峰

    原文:http://www.ruanyifeng.com/blog/2014/05/restful_api 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面 ...

  9. WallPaper

    LiveWallPaper 动态壁纸是从Android2.1就开始带有的一个新的特性.它让我们能够将本来毫无生气的静态的手机屏幕背景替换成 从 随着音乐的活力和脉动而跳跃的声线 到 手指抚过能激起阵阵 ...

  10. Fiddler抓包4-工具介绍(request和response)

    前言 本篇简单的介绍下fiddler界面的几块区域,以及各自区域到底是干什么用的,以便于各好的掌握这个工具 一.工具简介 1.第一块区域是设置菜单,这个前面2篇都有介绍 2.第二块区域是一些快捷菜单, ...