1. 线程的其他方法

import threading
import time
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()) # 获取线程名
print('主线程ID',current_thread().ident) # 获取线程id
print(current_thread()) # 当前线程对象
print(threading.enumerate()) # 当前正在运行的线程对象的一个列表 [<_MainThread(MainThread, started 6708)>, <Thread(Thread-1, started 7848)>]
print(threading.active_count()) # 当前正在运行的线程数

2. 线程队列 

线程队列中三种队列形式,所使用的方法相同,都有put(),get(),put_nowait(),get_nowait(),qsize(),full(),empty() 等这些方法.就只传一组先进先出的代码

import queue

先进先出队列:queue.Queue(n)

q = queue.Queue(3)
q.put(1)
q.put(2)
print('当前队列内容长度',q.qsize())
q.put(3)
print('查看队列是否满了',q.full()) try:
q.put_nowait(4)
except Exception:
print('队列满了') print(q.get())
print(q.get())
print(q.get())
print('查看队列是否为空',q.empty()) try:
q.get_nowait()
except Exception:
print('队列空了')

先进后出 / 后进先出队列:queue.LifoQueue(n)

优先级队列:

queue.priorityQueue(n)

  优先级队列中如果第一个参数相同,后面的比较方法为下面的描述.

  如果说值里面的元素是数字类型,那么当两个值的优先级相同时,比较的是两个值的大小,小的优先被取出来.如果元素是字符串,那么依次比较每个字母的ascii表中的位置,小的优

先被取出来.如果put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,越先被get到被取出来,第二个参数是put进去的值,如果说优先级相同,那么值别忘了应

该是相同的数据类型,字典不行

3. 线程池

from concurrent_futures import ThreadPoolExecutor,ProcessPoolExecutor

p = ThreadPoolExecutor(4)  #默认的线程个数是cpu个数 * 5

p = ProcessPoolExecutor(4)  #默认的进程个数是cpu个数

map(f1,可迭代对象)  : 异步提交任务

sublim(f1,参数)  : 异步提交任务,和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 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('主线程结束')

 线程池回调函数

  线程池的回调函数与进程池的相似

import time
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)

4. 协程

生成器版

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,20):
time.sleep(0.5)
print('f2=>', i)
next(g) f1()
f2()

greenlet模块

import time
from greenlet import greenlet def f1():
print('第一次f1')
g2.switch() #切换到g2这个对象的任务去执行
time.sleep(1)
print('第二次f1')
g2.switch() def f2():
print('第一次f2')
g1.switch()
time.sleep(1)
print('第二次f2') g1 = greenlet(f1) #实例化一个greenlet对象,并将任务名称作为参数参进去
g2 = greenlet(f2)
g1.switch() #执行g1对象里面的任务

gevent模块

from gevent import monkey;monkey.patch_all()

  这个模块只要有io的地方就会自动切换,不必非要用gevent模块,下面的代码中gevent.sleep(1) 换成time.sleep(1)也可以执行.

import gevent
from gevent import monkey;monkey.patch_all()
import time
import threading def f1():
print('第一次f1')
gevent.sleep(1) # time.sleep(1)
print('第二次f1') def f2():
print('第一次f2')
gevent.sleep(1) #time.sleep(1)
print('第二次f2') g1 = gevent.spawn(f1) #异步提交了f1任务
g2 = gevent.spawn(f2) #异步提交了f2任务
gevent.joinall([g1,g2]) #相当于g1.join()+g2.join()
print('主程序任务')

python并发编程之线程剩余内容(线程队列,线程池)及协程的更多相关文章

  1. python并发编程之多进程(三):共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  2. python并发编程基础之守护进程、队列、锁

    并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...

  3. python并发编程之多进程2-------------数据共享及进程池和回调函数

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  4. Python并发编程(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  5. python并发编程之进程2(管道,事件,信号量,进程池)

    管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...

  6. python3下multiprocessing、threading和gevent性能对比----暨进程池、线程池和协程池性能对比

    python3下multiprocessing.threading和gevent性能对比----暨进程池.线程池和协程池性能对比   标签: python3 / 线程池 / multiprocessi ...

  7. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  8. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  9. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  10. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

随机推荐

  1. 047 Permutations II 有重复数字的全排列

    给定一个可能包含重复数字的集合,返回所有可能的不同全排列.例如,[1,1,2] 有以下不同全排列:[  [1,1,2],  [1,2,1],  [2,1,1]] 详见:https://leetcode ...

  2. Zepto事件模块源码分析

    Zepto事件模块源码分析 一.保存事件数据的handlers 我们知道js原生api中要移除事件,需要传入绑定时的回调函数.而Zepto则可以不传入回调函数,直接移除对应类型的所有事件.原因就在于Z ...

  3. Xamarin.Form的坑

    首先说到xamarin.Forms的安装,简直是坑+坑+坑,为什么呢,有些坑你完全意想不到,比如说你改名字后报错,比如说上份代码能运行,在这里就不能运行,具体先将坑说说吧 坑1 文件名,动不动就报什么 ...

  4. java容器集合

    java 集合分为 Collection 和 Map 两大类 Collection 是 Java 集合框架的顶层接口,它是对容器类进行增.删.改.查的定义,同时继承了 Iterable 接口,具有对集 ...

  5. swift基础-3

    fallthrough 贯穿 case  可以不必写break 如果不需要知道区间内 每一项的值  可以使用 下划线 —— 来代替变量名 忽略 对该值的访问 for index in 1...5{ p ...

  6. cf1027F. Session in BSU(并查集 匈牙利)

    题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...

  7. ecshop分类页把分类描述改成FCKeditor编辑器

    最近放一个网站 http://www.macklin.cn/productline/35 有个产品分类页面需要添加分类缩略图和图文的描述 一.首先说下添加分类缩略图的步骤吧 1,依葫芦画瓢,参照的是e ...

  8. java代码关闭tomcat程序

    1.通过java代码实现tomcat的关闭 2.tomcatStop.java package test; import java.io.BufferedReader; import java.io. ...

  9. IIS 7.0的根文件(applicationHost.config)位置及说明

    位置 C:\Windows\System32\inetsrv\config\applicationHost.config 说明 https://www.microsoft.com/taiwan/tec ...

  10. php 基本连接mysql数据库和查询数据

    连接数据库,有三种方法 1. 常规方式: $con=mysql_connect($dbhostip,$username,$userpassword) or die("Unable to co ...