import threading
import time
def foo(n):
print('>>>>>>>>>>>>>>>%s'%n)
time.sleep(3)
print('tread 1')
t1=threading.Thread(target=foo,args=(2,))
#arg后面一定是元组,t1就是创建的子线程对象
t1.start()#把子进程运行起来
print('ending')
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print('ok')
time.sleep(2)
print('end')
t1=MyThread()#创建线程对象
t1.start()#激活线程对象
print('end again')
import threading
import time
def foo(n):
print('>>>>>>>>>>>>>>>%s'%n)
time.sleep(n)
print('tread 1')
def bar(n):
print('>>>>>>>>>>>>>>>>%s'%n)
time.sleep(n)
print('thread 2')
s=time.time()
t1=threading.Thread(target=foo,args=(2,))
t1.start()#把子进程运行起来
t2=threading.Thread(target=bar,args=(5,))
t2.start()
t1.join() #只是会阻挡主线程运行,跟t2没关系
t2.join()
print(time.time()-s)
print('ending')
'''
运行结果:
>>>>>>>>>>>>>>>2
>>>>>>>>>>>>>>>>5
tread 1
thread 2
5.001286268234253
ending
'''
import threading
import time
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print('ok')
time.sleep(2)
print('end')
t1=MyThread()#创建线程对象
t1.setDaemon(True)
t1.start()#激活线程对象
print('end again')
#运行结果是马上打印ok和 end again
#然后程序终止,不会打印end
import threading import time def sub(): global num temp=num num=temp-1 time.sleep(2) num=100 l=[]for i in range(100): t=threading.Thread(target=sub,args=()) t.start() l.append(t) for i in l: i.join() print(num)
import threading import time def sub(): global num lock.acquire()#获取锁 temp=num time.sleep(0.001) num=temp-1 lock.release()#释放锁 time.sleep(2) num=100 l=[] lock=threading.Lock() for i in range(100): t=threading.Thread(target=sub,args=()) t.start() l.append(t) for i in l: i.join() print(num)
import threading,time
class MyThread(threading.Thread):
def __init(self):
threading.Thread.__init__(self)
def run(self):
self.foo()
self.bar()
def foo(self):
LockA.acquire()
print('i am %s GET LOCKA------%s'%(self.name,time.ctime()))
#每个线程有个默认的名字,self.name就获取这个名字
LockB.acquire()
print('i am %s GET LOCKB-----%s'%(self.name,time.ctime()))
LockB.release()
time.sleep(1)
LockA.release()
def bar(self):#与
LockB.acquire()
print('i am %s GET LOCKB------%s'%(self.name,time.ctime()))
#每个线程有个默认的名字,self.name就获取这个名字
LockA.acquire()
print('i am %s GET LOCKA-----%s'%(self.name,time.ctime()))
LockA.release()
LockB.release()
LockA=threading.Lock()
LockB=threading.Lock()
for i in range(10):
t=MyThread()
t.start()
#运行结果:
i am Thread-1 GET LOCKA------Sun Jul 23 11:25:48 2017
i am Thread-1 GET LOCKB-----Sun Jul 23 11:25:48 2017
i am Thread-1 GET LOCKB------Sun Jul 23 11:25:49 2017
i am Thread-2 GET LOCKA------Sun Jul 23 11:25:49 2017
然后就卡住了
import threading,time
class MyThread(threading.Thread):
def __init(self):
threading.Thread.__init__(self)
def run(self):
self.foo()
self.bar()
def foo(self):
RLock.acquire()
print('i am %s GET LOCKA------%s'%(self.name,time.ctime()))
#每个线程有个默认的名字,self.name就获取这个名字
RLock.acquire()
print('i am %s GET LOCKB-----%s'%(self.name,time.ctime()))
RLock.release()
time.sleep(1)
RLock.release()
def bar(self):#与
RLock.acquire()
print('i am %s GET LOCKB------%s'%(self.name,time.ctime()))
#每个线程有个默认的名字,self.name就获取这个名字
RLock.acquire()
print('i am %s GET LOCKA-----%s'%(self.name,time.ctime()))
RLock.release()
RLock.release()
LockA=threading.Lock()
LockB=threading.Lock()
RLock=threading.RLock()
for i in range(10):
t=MyThread()
t.start()
import threading
import time
semaphore=threading.Semaphore(5)
def foo():
semaphore.acquire()
time.sleep(2)
print('ok')
semaphore.release()
for i in range(10):
t=threading.Thread(target=foo,args=())
t.start()
event.isSet():返回event的状态值; event.wait():如果 event.isSet()==False将阻塞线程; event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;设置对象的时候,默认是False的 event.clear():恢复event的状态值为False。
import threading,time
event=threading.Event() #创建一个event对象
def foo():
print('wait.......')
event.wait()
#event.wait(1)#if event 对象内的标志位为Flase,则阻塞
#wait()里面的参数的意思是:只等待1秒,如果1秒后还没有把标志位改过来,就不等了,继续执行下面的代码
print('connect to redis server')
print('attempt to start redis sever)')
time.sleep(3)
event.set()
for i in range(5):
t=threading.Thread(target=foo,args=())
t.start()
#3秒之后,主线程结束,但子线程并不是守护线程,子线程还没结束,所以,程序并没有结束,应该是在3秒之后,把标志位设为true,即event.set()
import queue
#队列里读写数据只有put和get两个方法,列表的那些方法都没有
q=queue.Queue()#创建一个队列对象 FIFO先进先出
#q=queue.Queue(20)
#这里面可以有一个参数,设置最大存的数据量,可以理解为最大有几个格子
#如果设置参数为20,第21次put的时候,程序就会阻塞住,直到有空位置,也就是有数据被get走
q.put(11)#放值
q.put('hello')
q.put(3.14)
print(q.get())#取值11
print(q.get())#取值hello
print(q.get())#取值3.14
print(q.get())#阻塞,等待put一个数据
import queue
import threading
#队列里只有put和get两个方法,列表的那些方法都没有
q=queue.Queue()#
def foo():#存数据
# while True:
q.put(111)
q.put(222)
q.put(333)
q.join()
print('ok')#有个join,程序就停在这里
def bar():
print(q.get())
q.task_done()
print(q.get())
q.task_done()
print(q.get())
q.task_done()#要在每个get()语句后面都加上
t1=threading.Thread(target=foo,args=())
t1.start()
t2=threading.Thread(target=bar,args=())
t2.start()
#t1,t2谁先谁后无所谓,因为会阻塞住,等待信号
import multiprocessing
import time
def foo():
print('ok')
time.sleep(2)
if __name__ == '__main__':#必须是这个格式
p=multiprocessing.Process(target=foo,args=())
p.start()
print('ending')
import multiprocessing import threading def foo(q): q.put([12,'hello',True]) if __name__ =='__main__': q=multiprocessing.Queue()#创建进程队列 #创建一个子线程 p=multiprocessing.Process(target=foo,args=(q,)) #通过传参的方式把这个队列对象传给父进程 p.start() print(q.get())
from multiprocessing import Pipe,Process
def foo(sk):
sk.send('hello')#主进程发消息
print(sk.recv())#主进程收消息
sock,conn=Pipe()#创建了管道的两头
if __name__ == '__main__':
p=Process(target=foo,args=(sock,))
p.start()
print(conn.recv())#子进程接收消息
conn.send('hi son')#子进程发消息
from multiprocessing import Process from multiprocessing import Manager def foo(l,i): l.append(i*i) if __name__ == '__main__': manager = Manager() Mlist = manager.list([11,22,33])#创建一个共享的列表 l=[] for i in range(5): #开辟5个子进程 p = Process(target=foo, args=(Mlist,i)) p.start() l.append(p) for i in l: i.join()#join 方法是等待进程结束后再执行下一个 print(Mlist)
from multiprocessing import Pool
import time
def foo(n):
print(n)
time.sleep(2)
if __name__ == '__main__':
pool_obj=Pool(5)#创建进程池
#通过进程池创建进程
for i in range(5):
p=pool_obj.apply_async(func=foo,args=(i,))
#p是创建的池对象
# pool 的使用是先close(),在join(),记住就行了
pool_obj.close()
pool_obj.join()
print('ending')
1.apply:从进程池里取一个进程并执行 2.apply_async:apply的异步版本 3.terminate:立刻关闭线程池 4.join:主进程等待所有子进程执行完毕,必须在close或terminate之后 5.close:等待所有进程结束后,才关闭线程池
import time
def consumer():#有yield,是一个生成器
r=""
while True:
n=yield r#程序暂停,等待next()信号
# if not n:
# return
print('consumer <--%s..'%n)
time.sleep(1)
r='200 ok'
def producer(c):
next(c)#激活生成器c
n=0
while n<5:
n=n+1
print('produer-->%s..'%n)
cr = c.send(n)#向生成器发送数据
print('consumer return :',cr)
c.close() #生产过程结束,关闭生成器
if __name__ == '__main__':
c=consumer()
producer(c)
from greenlet import greenlet
def foo():
print('ok1')
gr2.switch()
print('ok3')
gr2.switch()
def bar():
print('ok2')
gr1.switch()
print('ok4')
gr1=greenlet(foo)
gr2=greenlet(bar)
gr1.switch()#启动
import requests
import gevent
import time
def foo(url):
response=requests.get(url)
response_str=response.text
print('get data %s'%len(response_str))
s=time.time()
gevent.joinall([gevent.spawn(foo,"https://itk.org/"),
gevent.spawn(foo, "https://www.github.com/"),
gevent.spawn(foo, "https://zhihu.com/"),])
# foo("https://itk.org/")
# foo("https://www.github.com/")
# foo("https://zhihu.com/")
print(time.time()-s)
import socket
import select
sock=socket.socket()
sock.bind(('127.0.0.1',8080))
sock.listen(5)
inp=[sock,]
while True:
r=select.select(inp,[],[])
print('r',r[0])
for obj in r[0]:
if obj == sock:
conn,addr=obj.accept()
# 服务端
import socket
import time
import select
sock=socket.socket()
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind(('127.0.0.1',8080))
sock.listen(5)
inp=[sock,]#监听套接字对象的列表
while True:
r=select.select(inp,[],[])
print('r',r[0])
for obj in r[0]:
if obj == sock:
conn,addr=obj.accept()
inp.append(conn)
else:
data=obj.recv(1024)
print(data.decode('utf8'))
response=input('>>>>:')
obj.send(response.encode('utf8'))
import selectors,socket
sel=selectors.DefaultSelector()
sock=socket.socket()
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind(('127.0.0.1',8080))
sock.listen(5)
sock.setblocking(False)
def read(conn,mask):
data=conn.recv(1024)
print(data.decode('utf8'))
res=input('>>>>>>:')
conn.send(res.encode('utf8'))
def accept(sock,mask):
conn,addr=sock.accept()
sel.register(conn,selectors.EVENT_READ,read)#conn和read函数绑定
#绑定套接字对象和函数
#绑定(register)的意思就是,套接字对象conn发生变化时,绑定的函数能执行
sel.register(sock,selectors.EVENT_READ,accept)#中间那个是固定写法
while True:
events=sel.select() #监听套接字对象(注册的那个)
#下面几行代码基本上就固定写法了
# print('events',events)
for key,mask in events:
callback = key.data#绑定的函数,
# key.fileobj就是活动的套接字对象
# print('callback',callable)
#mask是固定的
callback(key.fileobj,mask)#callback是回调函数
# print('key.fileobj',key.fileobj)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有