多线程

线程:是操作系统的最小调度单位,是一串指令的集合

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),
])    

  

参考博主:金角大王

 

 

 

 

 

  

posted @ 2018-07-31 13:04  stling  阅读(147)  评论(0)    收藏  举报