标签:
一、线程
1、基本使用
创建线程,两种方式
第一种:
import threading
def f1(arg):
print(arg)
t=threading.Thread(target=f1,args=(123,))
t.start()
结果:
123
第二种:
import threading
class Myclass(threading.Thread):
def __init__(self,func,args):
self.func=func
self.args=args
super(Myclass,self).__init__()
def run(self):
self.func(self.args)
def f2(arg):
print(arg)
obj=Myclass(f2,123)
obj.start()
结果:
123
第二种方法就是我们自己来创建已经类,然后调用threading.Thread这个父类,然后在使用super来进行调用
2、生成者消费者模型(队列,但是和rabbitMQ不一样,这个是python自己的)
队列:总共有四种队列,分别是先进先出队列,后进后出队列,优先级队列,双向队列
import queue q=queue.Queue(2) print(q.empty()) q.put(11) q.put(22) print(q.qsize()) print(q.get()) q.get() q.task_done() print(q.get()) q.get() q.task_done() #q.join()
结果:
True 2 11
这个就是普通的先进先出队列
put是放数据,是否阻塞,阻塞是的超时时间
get是取数据(默认阻塞),是否阻塞,阻塞时的超时时间
queue.Queue(2)队列最大长度
qsize()真实个数
maxsize最大支持的个数
join、task_done,阻塞进程,当队列中任务执行完毕以后,不再阻塞
import queue q=queue.LifoQueue() q.put(123) q.put(345) print(q.get()) q1=queue.PriorityQueue() q1.put((1,"wzc1")) q1.put((1,"wzc11")) q1.put((1,"wzc1111")) q1.put((1,"wzc111")) q1.put((3,"wzc3")) q1.put((2,"wzc4")) print(q1.get()) q2=queue.deque() q2.append(123) q2.append(333) q2.appendleft(456) print(q2.pop()) print(q2.popleft())
结果:
345 (1, ‘wzc1‘) 333 456
后进后出队列==lifoqueue
优先级队列==priorityqueue
双向队列==deque
线程锁
lock和rlock的区别,一个是只支持单层锁,一个是支持多层锁
import threading
import time
NUM=10
def func(www):
global NUM
www.acquire()
NUM-=1
time.sleep(1)
print(NUM)
www.release()
lock=threading.Lock()
for i in range(10):
t=threading.Thread(target=func,args=(lock,))
t.start()
结果:
9 8 7 6 5 4 3 2 1 0
mport threading
def func(i,e):
print(i)
e.wait()#检测是什么信号
print(i+100)
event=threading.Event()
for i in range(20):
t=threading.Thread(target=func,args=(i,event,))
t.start()
event.clear()#禁止信号
inp=input(">>>")
if inp == "1":
event.set()#通行信号
结果:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>>1 103 102 106 107 108 109 112 113 115 118 101 104 110 114 117 100 116 105 119 111
另一种使用方法
import threading
def func(i,con):
print(i)
con.acquire()
con.wait()
print(i+100)
con.release()
c=threading.Condition()
for i in range(20):
t=threading.Thread(target=func,args=(i,c,))
t.start()
while True:
inp=input(">>>")
if inp == "q":
break
c.acquire()
c.notify(int(inp))
c.release()
结果:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>>3 >>>101 100 102 2 >>>103 104 5 >>>105 108 106 109 107
二、进程
1、基本使用
from multiprocessing import Process
from multiprocessing import queues
import multiprocessing
import time
def foo(i,arg):
arg.put(i)
print("say HI ",i,arg.qsize())
li=queues.Queue(20,ctx=multiprocessing)
for i in range(10):
p=Process(target=foo,args=(i,li,))
p.start()
进程测试的时候不加 if __name__ == ‘__main__‘: Windows无法执行,但是linux和mac可以,加上了就可以执行了
基本使用
默认数据不共享
queue
array
manager.dict
pipe
进程池
array:
from multiprocessing import Process
from multiprocessing import Array
import multiprocessing
import time
def foo(i,arg):
arg[i]=i+100
for items in arg:
print(items)
print("========")
li=Array("i",10)
for i in range(10):
p=Process(target=foo,args=(i,li,))
p.start()
结果:
100 0 0 0 0 0 0 0 0 0 ======== 100 101 0 0 0 0 0 0 0 0 ======== 100 101 102 0 0 0 0 0 0 0 ======== 100 101 102 103 0 0 0 0 0 0 ======== 100 101 102 103 104 0 0 0 0 0 ======== 100 101 102 103 104 105 0 0 0 0 ======== 100 101 102 103 104 105 106 0 0 0 ======== 100 101 102 103 104 105 106 107 0 0 ======== 100 101 102 103 104 105 106 107 108 0 ======== 100 101 102 103 104 105 106 107 108 109 ========
manager.dict
from multiprocessing import Process
from multiprocessing import Manager
import multiprocessing
import time
def foo(i,arg):
arg[i]=i+100
print(arg.values())
obj=Manager()
li=obj.dict()
for i in range(10):
p=Process(target=foo,args=(i,li,))
p.start()
time.sleep(0.1)
结果:
[100] [100, 101] [100, 101, 102] [100, 101, 102, 103] [100, 101, 102, 103, 104] [100, 101, 102, 103, 104, 105] [100, 101, 102, 103, 104, 105, 106] [100, 101, 102, 103, 104, 105, 106, 107] [100, 101, 102, 103, 104, 105, 106, 107, 108, 109] [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
进程池
pool.close()所有的任务执行完毕
pool.terminal()立即终止
from multiprocessing import Pool
import time
def f1(arg):
time.sleep(1)
print(arg)
pool=Pool(5)
for i in range(30):
#pool.apply(func=f1,args=(i,))
pool.apply_async(func=f1,args=(i,))
pool.close()
#time.sleep(1)
#pool.terminate()
pool.join()
结果:
0 1 2 3 4 5 6 7 8 9 11 10 12 13 14 16 15 17 18 19 21 22 20 23 24 25 27 26 28 29
三、协程
1、什么时候使用协程
2、greenlet
3、gevent
greenlet:
from greenlet import greenlet
def test1():
print(12)
gr2.swith()
print(34)
gr2.swith()
def test2():
print(56)
gr1.swith()
print(78)
gr1=greenlet(test1)
gr2=greenlet(test2)
gr1.swith()
gevent:
from gevent import monkey;monkey.patch.all()
import gevent
import requests
def f(url):
print("GET : %s" % url)
resp=requests.get(url)
data=resp.text
print("%d bytes received from %s" % (len(data),url))
gevent.joinall([
gevent.spwan(f,‘https://www.baidu.con‘),
gevent.spwan(f,‘https://www.yahoo.con‘),
gevent.spwan(f,‘https://www.github.con‘)
])
标签:
原文地址:http://www.cnblogs.com/wlzhc/p/5696230.html