多线程
线程:是操作系统的最小调度单位,是一串指令的集合
import threading
def foo(n):
print("in func foo ",n )
t_list = []
for i in range(20):
t = threading.Thread(target=foo,args=("t-%s" %i ,)) #创建一个线程
t.start() #启动一个线程
t_list.append(t)
for i in range(20):
t.join() #等待线程结束
threading.current_thread() threading.active_count() t.setDaemon(True) #把当前线程设置为守护线程,随主线程down,在t.start()之前设置
线程锁
import threading lock = threading.Lock() #创建一个锁 lock.acquire() #申请一个锁 ........ #运算操作 lock.release() #释放一个锁
递归锁
import threading lock = threading.RLock() #用法与线程锁类似,防止不同线程锁之间拿错“钥匙”
信号量
import threading semaphore = threading.BoundedSemaphore(5) # 最多允许5个线程同时运行
Event 事件
import threading
event = threading.Event() #定义一个事件
event.set() #设置标志位
event.clear() #清楚标志位
队列
import queue q = queue.Queue() q.get() q.put()
IO操作不占用CPU 就算占用CPU
Python多线程不适合CPU密集操作性任务,适合IO密集操作性任务
进程
import multiprocessing multiprocessing.Process() #与线程类似
获取进程ID:
import os
os.getppid() #获取父进程ID
os.getpid() #获取进程ID
#每一个子进程都是由父进程启动的
#进程queue 不是修改一份数据,实现数据的传递
进程锁,进程池pool
pool.apply() #同步
pool.apply_async() #异步
pool使用中,先pool.close() 再 pool.join()
协程:微线程,用户态的轻量级线程
from greenlet import greenlet
#封装好的协程 需要手动切换 .switch()
def foo():
print (1)
gr2.switch()
print (2)
gr2.switch()
def f2():
print (3)
gr1.switch()
print (4)
gr1.switch()
gr1 = greenlet(foo)
gr2 = greenlet(f2)
gr1.switch()
自动切换Gvent
import gevent
from gevent import socket, monkey
monkey.patch_all() #所有io操作
def foo():
pass
def bar():
pass
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
参考博主:金角大王

浙公网安备 33010602011771号