线程的其他方法:
 from threading import Thread,current_thread:
currrent_thread().getName()  获取线程的名称
current_thread().ident   获取到线程的id
current_thread()  当前线程的信息
import threading  #导入threading模块才能使用下面的功能:
threading.enumerate()  当前正在运行线程对象的列表
threading.active_count()   活动的线程
 
import time
import threading
from threading import  Thread,current_thread
 
def f1(n):
    time.sleep(1)
    print('子线程名称',current_thread().getName())
    print('%s号线程任务' %n)
 
 
if __name__ == '__main__':
    t1 =Thread(target=f1,args=(1,))
    t1.start()
    print('主线程名称',current_thread().getName())  ###MainThread
    print('主线程ID',current_thread().ident)     ##2260
    print(current_thread())   #当前线程<_MainThread(MainThread, started 2260)>
    print(threading.enumerate())   #[<_MainThread(MainThread, started 2260)>, <Thread(Thread-1, started 2520)>]  当前正在运行线程对象的列表
    print(threading.active_count())  # 活动的线程  #2
线程池(重点) 
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
p =ThreadPoolExecutor()  默认的线程个数是cpu个数 *5
p = ProcessPoolExecutor()  默认的进程个数是cup个数(核数)
p.map(f1, 可迭代的对象)  异步执行
def f1(n1,n2):
      print(n1,n2)
 p.submit(f1,11,12)
 res=p.submit(f1,11,12)
异步提交任务,里面无敌传参,但是形参位置必须对应实参接收
res.result()  和get 方法一样,如果没有结果,会等待,阻塞程序  
shutdown() close+join锁定线程池,等待线程池中所有已经提交的任务全部执行完毕
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 (n,s)
 
 
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,'藤椒')  #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('主线程结束')
 
 
 
队列(重点)
先进先出
queue.Queue()  先进先出队列
q.qsize()  当前内容的长度
q.full() 查看队列是否满了
q.empty()  查看队列是否空了
q.put_nowait()   放入不等待,程序往下执行
q.get_nowait()  获取不等待,程序往下执行
import queue
 
 
#先进先出队列
q =queue.Queue(3)
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('队列空了')
先进后出,或者后进先出,类似于栈fifo: first in first out
queue.LifoQueue()  先进后出\后进先出队列
import queue
 
q = queue.LifoQueue(3)
 
q.put(1)
q.put(2)
q.put(3)
 
print(q.get())
print(q.get())
print(q.get())
优先队列:
queue.PriorityQueue()
put的数据是一个元组,元组的第一个参数是优先级数字,数字越下,优先级越高,越先被get到被去出来,第二个参数是put进去的值,吐过说优先级相同,那么直别忘了应该是相同的数据类型,字典不行
    如果优先级数字相同,会比较第二个参数的元素的ascii表中的位置,如果数据类型不同会报错.
    如果说值里面的元素是数字类型,那么两个值的优先级相同时,比较的是两个值得大小,小的优先被去出来.
import queue
 
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,'zalex'))
# q.put((-1,'yubing'))
# 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())
协程:轻量型线程.  生成器,Greenlet模块,Gevent模块(重点)
协程:一个线程里面实现任务的并发:变成生成器(记录状态),实现两个程序的来回切换,实现并发
生成器版协程:
import time
 
def f1():
    for i in range(10):
        time.sleep(0.5)
        print('f1>>',i)
        yield
 
def f2():
    g = f1()
    for i in range(10):
        time.sleep(0.5)
        print('f2>>', i)
        next(g)
 
f1()
f2()
Greenlet模块
如果导入模块报错,是没有加载第三方的模块,首先:在py解释器上找到Terminal输入:pip install greenlet,如果提示不是内部命令,找到python安装的位置的路径,Scripts文件里面的pip,选择路径,添加到环境变量里面(我的电脑--属性--高级系统设置--环境变量--Path新建添加),在使用管理员命令输入pip install greenlet,最后重启解释器就完成啦,可以开心的使用.
import time
import greenlet
from greenlet import greenlet
 
def f1(s):
    print('第一次f1'+s)
    g2.switch('taibai')
    time.sleep(1)
    print('第二次f1' + s)
    g2.switch()
def f2(s):
    print('第一次f2' + s)
    g1.switch()
    time.sleep(1)
    print('第二次f2' + s)
 
g1 = greenlet(f1)
g2 = greenlet(f2)
g1.switch('alex')
Gevent模块(重点)
import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading
 
def f1():
    print('第一次f1')
    # print(threading.current_thread().getName())
    # gevent.sleep(1)
    time.sleep(2)
    print('第二次f1')
 
def f2():
    # print(threading.current_thread().getName())
    print('第一次f2')
    # gevent.sleep(2)
    time.sleep(2)
    print('第二次f2')
 
s = time.time()
g1 = gevent.spawn(f1) #异步提交了f1任务
g2 = gevent.spawn(f2) #异步提交了f2任务
# g1.join()
# g2.join()
gevent.joinall([g1,g2])
e = time.time()
print('执行时间:',e-s)
print('主程序任务')
线程池的回调函数
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
 
def f1(n,s):
    return n+s
 
def f2(n):
 
    print('回调函数>>>',n.result())
if __name__ == '__main__':
 
    tp = ThreadPoolExecutor(4)
 
    res = tp.submit(f1,11,12).add_done_callback(f2)
 
    # print(res.result())
 
 
线程的其他方法:
 from threading import Thread,current_thread:
currrent_thread().getName()  获取线程的名称
current_thread().ident   获取到线程的id
current_thread()  当前线程的信息
import threading  #导入threading模块才能使用下面的功能:
threading.enumerate()  当前正在运行线程对象的列表
threading.active_count()   活动的线程
 
import time
import threading
from threading import  Thread,current_thread
 
def f1(n):
    time.sleep(1)
    print('子线程名称',current_thread().getName())
    print('%s号线程任务' %n)
 
 
if __name__ == '__main__':
    t1 =Thread(target=f1,args=(1,))
    t1.start()
    print('主线程名称',current_thread().getName())  ###MainThread
    print('主线程ID',current_thread().ident)     ##2260
    print(current_thread())   #当前线程<_MainThread(MainThread, started 2260)>
    print(threading.enumerate())   #[<_MainThread(MainThread, started 2260)>, <Thread(Thread-1, started 2520)>]  当前正在运行线程对象的列表
    print(threading.active_count())  # 活动的线程  #2
线程池(重点) 
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
p =ThreadPoolExecutor()  默认的线程个数是cpu个数 *5
p = ProcessPoolExecutor()  默认的进程个数是cup个数(核数)
p.map(f1, 可迭代的对象)  异步执行
def f1(n1,n2):
      print(n1,n2)
 p.submit(f1,11,12)
 res=p.submit(f1,11,12)
异步提交任务,里面无敌传参,但是形参位置必须对应实参接收
res.result()  和get 方法一样,如果没有结果,会等待,阻塞程序  
shutdown() close+join锁定线程池,等待线程池中所有已经提交的任务全部执行完毕
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 (n,s)
 
 
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,'藤椒')  #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('主线程结束')
 
 
 
队列(重点)
先进先出
queue.Queue()  先进先出队列
q.qsize()  当前内容的长度
q.full() 查看队列是否满了
q.empty()  查看队列是否空了
q.put_nowait()   放入不等待,程序往下执行
q.get_nowait()  获取不等待,程序往下执行
import queue
 
 
#先进先出队列
q =queue.Queue(3)
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('队列空了')
先进后出,或者后进先出,类似于栈fifo: first in first out
queue.LifoQueue()  先进后出\后进先出队列
import queue
 
q = queue.LifoQueue(3)
 
q.put(1)
q.put(2)
q.put(3)
 
print(q.get())
print(q.get())
print(q.get())
优先队列:
queue.PriorityQueue()
put的数据是一个元组,元组的第一个参数是优先级数字,数字越下,优先级越高,越先被get到被去出来,第二个参数是put进去的值,吐过说优先级相同,那么直别忘了应该是相同的数据类型,字典不行
    如果优先级数字相同,会比较第二个参数的元素的ascii表中的位置,如果数据类型不同会报错.
    如果说值里面的元素是数字类型,那么两个值的优先级相同时,比较的是两个值得大小,小的优先被去出来.
import queue
 
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,'zalex'))
# q.put((-1,'yubing'))
# 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())
协程:轻量型线程.  生成器,Greenlet模块,Gevent模块(重点)
协程:一个线程里面实现任务的并发:变成生成器(记录状态),实现两个程序的来回切换,实现并发
生成器版协程:
import time
 
def f1():
    for i in range(10):
        time.sleep(0.5)
        print('f1>>',i)
        yield
 
def f2():
    g = f1()
    for i in range(10):
        time.sleep(0.5)
        print('f2>>', i)
        next(g)
 
f1()
f2()
Greenlet模块
如果导入模块报错,是没有加载第三方的模块,首先:在py解释器上找到Terminal输入:pip install greenlet,如果提示不是内部命令,找到python安装的位置的路径,Scripts文件里面的pip,选择路径,添加到环境变量里面(我的电脑--属性--高级系统设置--环境变量--Path新建添加),在使用管理员命令输入pip install greenlet,最后重启解释器就完成啦,可以开心的使用.
import time
import greenlet
from greenlet import greenlet
 
def f1(s):
    print('第一次f1'+s)
    g2.switch('taibai')
    time.sleep(1)
    print('第二次f1' + s)
    g2.switch()
def f2(s):
    print('第一次f2' + s)
    g1.switch()
    time.sleep(1)
    print('第二次f2' + s)
 
g1 = greenlet(f1)
g2 = greenlet(f2)
g1.switch('alex')
Gevent模块(重点)
import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading
 
def f1():
    print('第一次f1')
    # print(threading.current_thread().getName())
    # gevent.sleep(1)
    time.sleep(2)
    print('第二次f1')
 
def f2():
    # print(threading.current_thread().getName())
    print('第一次f2')
    # gevent.sleep(2)
    time.sleep(2)
    print('第二次f2')
 
s = time.time()
g1 = gevent.spawn(f1) #异步提交了f1任务
g2 = gevent.spawn(f2) #异步提交了f2任务
# g1.join()
# g2.join()
gevent.joinall([g1,g2])
e = time.time()
print('执行时间:',e-s)
print('主程序任务')
线程池的回调函数
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
 
def f1(n,s):
    return n+s
 
def f2(n):
 
    print('回调函数>>>',n.result())
if __name__ == '__main__':
 
    tp = ThreadPoolExecutor(4)
 
    res = tp.submit(f1,11,12).add_done_callback(f2)
 
    # print(res.result())
 
 

day 34线程的其他方法,线程池的更多相关文章

  1. java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...

  2. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  3. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  4. [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  5. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  6. C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  7. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),

    1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...

  8. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...

  9. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

随机推荐

  1. python 3 过滤股票

    参考某个博客,代码不全,地址找不到了见谅,加了些自己弄的算法. 备忘 #-*- coding: utf-8 -*-import os, reimport time def filefilter(com ...

  2. js构建类的方法

    Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class.(不过,ES6引入了Class这个概念,作为对 ...

  3. C# winfrom界面跳转闪烁问题解决方法

    在窗体的构造函数中添加代码: SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, ...

  4. 用timer自定义计划任务时间

    应业务需求,需要将指定程序,按照指定时间进行运行, 而windows计划任务最小运行间隔时间为1分钟,完全不能满足当前需求, 有两种方案,一种是安装win服务方式,考滤到维护困难,另一种是timer方 ...

  5. 枚举类型与位域枚举Enum

    一.概述 定义一个值类型,其中包含固定值集合.枚举类型变量可以是此集合中的任意一个或多个值.枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚 ...

  6. web自动化_浏览器驱动chromedriver安装方法(适用RF框架/Selenium/Appium)

    在进行UI自动化时,打开浏览器是第一步,这就必须要安装浏览器的驱动,chrome浏览器需要安装chromedriver,下载地址:http://chromedriver.storage.googlea ...

  7. 2、Python文件操作工具 xlrd 工具

    #打开excel文档workbook = xlrd.open_workbook('..\cye.xls',encoding_override='utf-8') #获取sheet页信息sheet = w ...

  8. PhoneGap的通知

    一.通知类型列表 1.notification.alert         提示警告框 2.notification.confirm                  确认对话框 3.notifica ...

  9. 协议森林09 爱的传声筒 (TCP连接)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在TCP协议与"流"通信中,我们概念性的讲解了TCP通信的方式 ...

  10. BZOJ3926:[ZJOI2015]诸神眷顾的幻想乡(广义SAM)

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...