笔记-python-多线程-深入-1
笔记-python-多线程-深入-1
1. 线程池
1.1. 线程池:控制同时存在的线程数量
threading没有线程池,只能自己控制线程数量。
基本有两种方式:
- 每间隔一段时间创建一批线程
- 加一层循环,进行条件判断,如果线程数量小于预定值则创建新线程,否则等待;
使用queue,条件判断都属于这种方式。
# 线程函数1
def th(num=3):
print('{} enter th:{}'.format(num,
threading.get_ident()))
print('the main thread
is:{}'.format(threading.main_thread()))
print('th:active thread\'s num is
{}'.format(threading.active_count()))
time.sleep(5)
print('th end',num)
# 方式1:一批批创建
def multithreads1(*args):
print('enter multithreads1')
t_list = list()
for _ in range(7):
t_list.append(threading.Thread(target=th, args=(_,),name= 'aaa'))
for _ in t_list:
_.daemon = True
_.start()
print('from
multithreads:',threading.get_ident(),threading.activeCount())
#print('active
threads:',threading.enumerate())
'''
for _ in t_list:
print(type(_))
_.join()
'''
t_list = threading.enumerate()
print(type(t_list))
print('t_list:',t_list)
for _ in t_list:
if _.name == 'aaa':
_.join()
print('main thread end.')
# 方式2:控制总任务数,每次循环检查活动线程数,如果较少则创建新线程
# 通过信号量/变量条件控制总循环次数
def multithreads2(task_nums=100, max_threads=5, *args):
task_i = 0
while task_i < task_nums:
if threading.active_count() <
max_threads:
t =
threading.Thread(target=th, args=(task_i,))
t.daemon = True
t.start()
else:
time.sleep(2)
'''
# 测active_count()
print('this is in mainthread:\nthread num is {},thread id is
{}'.format(threading.activeCount(),threading.get_ident()))
#th(3)
multithreads1()
print('main_thread stop:{}'.format(threading.current_thread()))
'''
# 线程调用函数
import queue
def th1(num=-1):
print('enter th1.',num)
time.sleep(3)
print('end th1.',num)
# 方式3:
def multithreads3(*args):
print('enter multithreads3!')
q = queue.Queue()
for i in range(3):
q.put(i)
thread_num_max = 10
while True:
if threading.active_count() <=
thread_num_max:
proxy = q.get()
if proxy is None:
print('break')
break
thread_t =
threading.Thread(target=th1, args=(proxy,))
thread_t.deamon = True
thread_t.start()
t_list = threading.enumerate()
for _ in t_list:
if _ is
threading.current_thread():
pass
else:
_.join()
print('active thread number:',threading.active_count())
总结:
1.可以对死亡线程进行join
2.一定要注意join方式,否则容易成为单线程。
3.activecount 包括主线程,是进程内所有的线程数。
2.
线程返回运行结果
class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except Exception:
return None
笔记-python-多线程-深入-1的更多相关文章
- Python 爬虫笔记、多线程、xml解析、基础笔记(不定时更新)
1 Python学习网址:http://www.runoob.com/python/python-multithreading.html
- Python Web学习笔记之多线程编程
本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...
- Python多线程及其使用方法
[Python之旅]第六篇(三):Python多线程及其使用方法 python 多线程 多线程使用方法 GIL 摘要: 1.Python中的多线程 执行一个程序,即在操作系统中开启了一个进 ...
- python多线程学习记录
1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python多线程
python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- python 多线程就这么简单(续)
之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...
随机推荐
- centos7服务器搭建javaweb运行环境及代码部署
之前在一直在学习java web终于写完了第一个小demo,于是在阿里云上买了一个服务器,开始了配置服务器环境的踩坑之旅.... ps:本文不讨论服务器配置的具体步骤,网上都很多,按部就班就是,本文主 ...
- [转]WinForm下Splash(启动画面)制作
本文转自:http://www.smartgz.com/blog/Article/1088.asp 原文如下: 本代码可以依据主程序加载进度来显示Splash. static class Progra ...
- System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
System.Data.SqlClient.SqlException: 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值.解决办法是: 而这位大哥提出的解决办法 ...
- javaWeb上移下移(SpringMVC+Mabits+MySql)
文章已移至:https://blog.csdn.net/baidu_35468322/article/details/79643356 移动之前: 移动之后: 1.控制层 /** * 修改排序 * * ...
- 笨办法学Python(三十三)
习题 33: While 循环 接下来是一个更在你意料之外的概念: while-loop``(while 循环).``while-loop 会一直执行它下面的代码片段,直到它对应的布尔表达式为 Fal ...
- Google Java编程风格指南(转)
目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...
- Cannot start session without errors, please check errors given in your PHP and/or webserver log file and configure your PHP installation properly.错误
错误如图示: 1.在php的目录下建立个文件夹tmp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的.2.在php.ini找到session.save_pa ...
- 对类参数的序列化和反序列化XML
/// <summary> /// Xml序列化与反序列化 /// </summary> public class XmlUtil { #region 反序列化 /// < ...
- Poj(1521),哈夫曼编码
题目链接:http://poj.org/problem?id=1521 这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客 ...
- C++STL之multiset多重集合容器
multiset多重集合容器 multiset与set一样, 也是使用红黑树来组织元素数据的, 唯一不同的是, multiset允许重复的元素键值插入, 而set则不允许. multiset也需要声明 ...