Python 进程线程之间通信方式(1,基于队列的)
1.Python队列的基本示例#!/usr/bin/env python# -*- coding:utf-8 -*-#Author:xp#blog_url: http://blog.csdn.net/wuxingpu5/article/details/71209731#多进程共享一套文件系统# from multiprocessing import Process#
·
1.Python队列的基本示例
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:xp
#blog_url: http://blog.csdn.net/wuxingpu5/article/details/71209731
#多进程共享一套文件系统
# from multiprocessing import Process
# import time,random
#
# def work(filename,msg):
# with open(filename,'a',encoding='utf-8') as f:
# f.write(msg)
#
# if __name__ == '__main__':
#
# for i in range(5):
# p=Process(target=work,args=('a.txt','进程名%s'%(str(i))))
# p.start()
# '''写入效果为随机的 可以看出是并发效果 '''
from multiprocessing import Process,Queue
q=Queue(3)
q.put({'a':1})
q.put('b')
q.put(3)
#q.put('d',False) 相同 报错提示已满 full
#q.put_nowait('d')
#q.put('d',timeout=2) #超时时间
#q.put(4) 内部没有空间或者取空之后会一直等待
print(q.get())
print(q.get())
print(q.get())
# print(q.get(block=False)) #不等待,直接报错
# print(q.get_nowait())
# print(q.get(timeout=2))
q.put('d',False)
#判断空还是满 或者大小
print(q.full())
print(q.empty())
print(q.qsize())
2.Python队列实际应用 生产者消费者模型
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:xp
#blog_url: http://blog.csdn.net/wuxingpu5/article/details/71209731
from multiprocessing import Process,Queue
from multiprocessing import JoinableQueue
import time
import random
# def consumer(q,name):
# while True:
# time.sleep(random.randint(1,3))
# res=q.get()
# print('消费者%s拿到了%s'%(name,res))
#
# def producer(seq,q,name):
# for item in seq:
# time.sleep(random.randint(1,3))
# q.put(item)
# print('\033[42m生产者%s生产了%s\033[0m' %(name,item))
# if __name__ == '__main__':
# q=Queue()
# c=Process(target=consumer,args=(q,'xp'),)
# c.start()
#
#
# seq=['包子%s'%i for i in range(10)]
# producer(seq,q,'厨师1')
# print('主进程')
# '''最后发一个空字符,解决死循环问题'''
# def consumer(q,name):
# while True:
# time.sleep(random.randint(1,3))
# res=q.get()
# if res is None:break
# print('消费者%s拿到了%s'%(name,res))
#
# def producer(seq,q,name):
# for item in seq:
# time.sleep(random.randint(1,3))
# q.put(item)
# print('\033[42m生产者%s生产了%s\033[0m' %(name,item))
# q.put(None)
# if __name__ == '__main__':
# q=Queue()
# c=Process(target=consumer,args=(q,'xp'),)
# c.start()
#
#
# seq=['包子%s'%i for i in range(10)]
# #producer(seq,q,'厨师1')
# p=Process(target=producer,args=((seq,q,'xingpu')))
# p.start()
# print('主进程')
'''
q.join()
join等待收到全部task_done回应
q.task_done()
主进程等待生产者结束 p.join
生产者等待消费者取完数据结束,一旦取完就不再阻塞
消费者c.daemon 主进程完毕即回收,消费者已无存在必要
'''
def consumer(q,name):
while True:
#time.sleep(random.randint(1,3))
res=q.get()
q.task_done()
print('消费者%s拿到了%s'%(name,res))
def producer(seq,q,name):
for item in seq:
#time.sleep(random.randint(1,3))
q.put(item)
print('\033[42m生产者%s生产了%s\033[0m' %(name,item))
q.join()
print('===========>:')
if __name__ == '__main__':
q=Queue()
q=JoinableQueue() #JoinableQueque可以确认是否取完
c=Process(target=consumer,args=(q,'xp'),)
c.daemon=True
c.start()
seq=['包子%s'%i for i in range(10)]
#producer(seq,q,'厨师1')
p=Process(target=producer,args=((seq,q,'xingpu')))
p.start()
p.join()
#c.join()
print('主进程')
3.附录 列表生成式
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:xp
#blog_url: http://blog.csdn.net/wuxingpu5/article/details/71209731
res1=[i for i in range(10)]
print(res1)
res1=[i for i in range(10) if i > 5] #判断大于5的写入列表 不能有else
print(res1)
更多推荐
已为社区贡献39条内容
所有评论(0)