潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)
循环执行一个线程
# -*- 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 并发(进程与线程池) 第十四课 (课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)
#斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- Java并发编程:线程池的使用(转)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 【转】Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 13、Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程之线程池及示例
1.Executor 线程池顶级接口.定义方法,void execute(Runnable).方法是用于处理任务的一个服务方法.调用者提供Runnable 接口的实现,线程池通过线程执行这个 Runn ...
随机推荐
- MySQL版本升级参考资料【转】
MySQL升级参考资料 MySQL 升级的最佳实践 - 技术翻译 - 开源中国社区https://www.oschina.net/translate/mysql-upgrade-best-practi ...
- 【bzoj1901】dynamic ranking(带修改主席树)
传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...
- eclipse 反编译
Eclipse Class Decompiler安装此插件,可以编译源代码且调试
- 解决git: 'subtree' is not a git command. See 'git --help'.
一.第一方法 git clone https://github.com/git/git.git cd git/contrib/subtree sudo make prefix=/usr sudo ma ...
- Java桌面程序打包成exe可执行文件
前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...
- 将数据库从Oracle迁移到SQL Server
参考链接:http://www.360doc.com/content/15/0310/14/9260775_454038517.shtml
- 前端工程化之webpack中配置babel-loader(四)
安装 安装:npm i -D babel-core babel-loader babel-plugin-transform-runtime 安装:npm i -D babel-preset-es201 ...
- java多线程快速入门(二)
通过继承Thread类来实行多线程 package com.cppdy; //通过继承Thread类来实行多线程 class MyThread extends Thread{ @Override pu ...
- wpf 用户自定义事件传参2
public delegate void MenuButtonClickEventHandler(object sender, EventArgs e); public event MenuButto ...
- 使用caffe模型测试图片(python接口)
1.加载相关模块 1.1 加载numpy import numpy as np 1.2 加载caffe 有两种方法. 方法一(静态导入): 找到当前环境使用的python的site-packages目 ...