python网络编程--线程的方法,线程池
一.线程的其他方法(Thread其他属性和方法)
ident() 获取线程id
Thread实例对象的方法
isAlive() 设置线程名
getName() 返回线程名
setName() 设置线程名
threading模块提供的一些方法:
threading.currentThread() 返回当前的线程变量
threading.enumerate() 返回一个包含正在运行的线程的list,正在运行指线程启动后,结束前,不包括启动前和终止后的线程
threading.activeCount() 返回正在运行的线程数量,与len(threading.enumerate()有相同的结果)
示例:
import threading
import time
from threading import Thread,current_thread def f1(n):
time.sleep(1)
print('子线程名称', current_thread().getName()) #Thread-1
print('%s号线程任务'%n) if __name__ == '__main__':
t1 = Thread(target=f1,args=(1,))
t1.start()
print('主线程名称',current_thread().getName()) #MainThread
print('主线程ID',current_thread().ident)
print(current_thread())
print(threading.enumerate()) #[<_MainThread(MainThread, started 6708)>, <Thread(Thread-1, started 7848)>]
print(threading.active_count())
# print('主线程') 主线程名称 MainThread
主线程ID 5720
<_MainThread(MainThread, started 5720)>
[<_MainThread(MainThread, started 5720)>, <Thread(Thread-1, started 12572)>]
2
子线程名称 Thread-1
1号线程任务
二.线程队列
共有三种基本用法:Queue,LifoQueue,PriorityQueue
1)队列Queue
一:先进先出队列
q = queue.Queue(3) #先进先出 fifo first in first out
q.put(1)
q.put(2)
# print('当前队列内容长度',q.qsize())
q.put(3)
print('查看队列是否满了',q.full())
try:
q.put_nowait(4) # 报错queue.Full
except Exception:
print('队列满了')
print(q.get())
print(q.get())
print('查看队列是否为空',q.empty())
print(q.get())
print('查看队列是否为空',q.empty())
try:
q.get_nowait() # queue.Empty
except Exception:
print('队列空了')
2)先进后出队列LifoQueue (last in first out), 类似于栈
二 先进后出队列,或者后进先出,类似于栈
q = queue.LifoQueue(3) q.put(1)
q.put(2)
q.put(3) print(q.get())
print(q.get())
print(q.get())
3)优先级队列:存储数据时可设置优先级队列
用put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较,数字越小优先级越高)
#优先级队列
q = queue.PriorityQueue(5)
# q.put((5,'alex'))
# q.put((2,'嘿嘿'))
# q.put((7,'哈哈')) # q.put((5,(2,3)))
q.put((5,(2,3))) #如果说值里面的元素是数字类型,那么当两个值的优先级相同时,比较的是两个值的大小,小的优先被取出来
#如果元素是字符串,那么依次比较每个字母的ascii表中的位置,小的优先被取出来
# q.put((2,{'x':3}))
# q.put((5,(1,2)))
q.put((5,(2,2,3)))
q.put((2,'zasdf'))
q.put((-1,'yadsf'))
q.put((2,{'k':666})) #如果优先级数字相同,如果数据类型不同会报错
q.put((2,('a','b')))
q.put((1,(1,2)))
q.put((3,(1,2)))
q.put((-10,(1,2)))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
三.线程池
1.使用multiprocessing模块创建
from threading import Thread thread_pool = ThreadPoolManger(4)
2.使用concurrent.futures模块创建
现在python提供了一个新的标准或者说内置的模块,这个模块里面提供了新的线程池和进程池,之前我们说的进程池是在multiprocessing里面的,现在这个在这个新的模块里面,他俩用法上是一样的。 将进程池和线程池放到一起,统一使用方式,使用threadPollExecutor和ProcessPollExecutor的方式一样,而且只要通过这个concurrent.futures导入就可以直接用他们两个了
p = ThreadPoolExecutor(4) # 默认个数是 cpu的个数*5
p = ProcessPoolExecutor(4) # 默认个数是cpu的核数 Res.result() #和get方法一样,如果没有结果,会等待,阻塞程序
基本方法:
submit(fn,*args,**kwargs) 异步提交任务 map(func,*iterables, timeout=None, chunksize=1) 取代for循环submit的操作 shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作
wait = True, 等待池内所有任务执行完毕回收完资源后才继续
wait = False 立即返回,并不会等待池内的任务执行完毕
但不管wait参数为何值,整个程序都会等到所有任务执行完毕
submit和map必须在shutdown之前 result(timeout = None) 取得结果 add_done_callback(fn) 回调函数
示例:
import time
from threading import current_thread
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def f1(n,s):
time.sleep(1)
# print('%s号子线程'%current_thread().ident)
# print(n,s)
return if __name__ == '__main__': tp = ThreadPoolExecutor(4)
# tp = ProcessPoolExecutor(4)
# tp.map(f1,range(10)) #异步提交任务,参数同样是任务名称,可迭代对象
res_list = []
for i in range(10):
res = tp.submit(f1,i,'baobao') #submit是给线程池异步提交任务,
print(res)
# res.result()
res_list.append(res) # for r in res_list:
# print(r.result()) tp.shutdown() #主线程等待所有提交给线程池的任务,全部执行完毕 close + join
for r in res_list:
print(r.result())
print('主线程结束')
python网络编程--线程的方法,线程池的更多相关文章
- python网络编程--管道,信号量,Event,进程池,回调函数
1.管道 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行任务修改,即串行修改,速度慢了,但牺牲了速度却保证了数据安全. 文件共享数据实现进程间的通信,但问题是: 1.效率低(共享 ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- 28、Python网络编程
一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...
- python 网络编程:socket
在学习socket之前,我们先复习下相关的网络知识. OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.OSI七层模型是由国际标准化组织ISO定义的网络的基本结构,不仅包括一 ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
随机推荐
- VS2010开发MFC ActiveX,摄像头拍照上传Webservice(1)
最近工作项目,BS中需要用到摄像头拍照,需要存储本地,同时上传到服务器,尝试使用vc++做ActiveX来实现. 完全没有使用过vc,上网搜索各种知识,初步完成.在这里记录下有帮助的资料. 第一步:编 ...
- leetcode303
public class NumArray { List<int> list = new List<int>(); public NumArray(int[] nums) { ...
- C++Builder STL 泛型
STL(Standard Template Library)标准模板库, 包括了算法,容器,迭代器.就是泛型. 向量(vector) 连续存储的元素<vector>列表(list) 由节点 ...
- libcurl使用心得-包括下载文件不存在处理相关(转)
libcurl使用心得 Libcurl为一个免费开源的,客户端url传输库,支持FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平台,支持 ...
- MD5 几种方法的选择
转:http://zoroeye.iteye.com/blog/2026984?utm_source=tuicool&utm_medium=referral md5加密实现方法有很多种,也导致 ...
- 《C语言基础日常笔记》
1. 类型转换-----------------20130902 a, 浮点数(包括单精度与双精度)赋值给整型变量时,舍弃浮点数的小数部分,直接将其整数部分存放在整型变量里. b, 整型变量赋值给浮点 ...
- PHP 将HTML转成PDF文件,HTML 转word,Word 转Html
html转 PDF 用MPDF ,Word转Html 纯PHP的方法暂未找到Word直接转PDF的方法 可以使用 LibreOffice 6.1 (Liunx,win) 皆可使用 Html转成PD ...
- 33-wxpython多个frame之间的信息共享
https://blog.csdn.net/xyisv/article/details/78576932 https://blog.csdn.net/tianmaxingkong_/article/d ...
- ADF控件ID变化引发JS无法定位控件的解决方法
原文地址:ADF控件ID变化引发JS无法定位控件的解决方法作者:Nicholas JSFF定义的控件ID到了客户端时往往会改变.例如在JSFF中的一个的ID为"ot1",但是当这个 ...
- WPF设置Window的数据上下文(DataContext)为自身
WPF设置Window的数据上下文(DataContext)为自身的XAML: DataContext="{Binding RelativeSource={RelativeSource Se ...