Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3029442
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 6125
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-11 09:12
个人简介

To be a better coder

文章分类

全部博文(877)

文章存档

2022年(1)

2021年(60)

2020年(175)

2019年(207)

2018年(210)

2017年(143)

2016年(81)

分类: LINUX

2019-04-17 16:08:18

https://www.cnblogs.com/guguobao/p/9398653.html

1 python提供了多种进程通信的方式,主要Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信

1.1 Queue有两个方法:

  • Put方法:以插入数据到队列中,他还有两个可选参数:blocked和timeout。详情自行百度

  • Get方法:从队列读取并且删除一个元素。同样,他还有两个可选参数:blocked和timeout。详情自行百度

#!coding:utf-8 from multiprocessing import Process, Queue import os,time,random #写数据进程执行的代码 def proc_write(q,urls): print 'Process is write....' for url in urls:
        q.put(url) print 'put %s to queue... ' %url
        time.sleep(random.random()) #读数据进程的代码 def proc_read(q): print('Process is reading...') while True:
        url = q.get(True)
        print('Get %s from queue' %url) if __name__ == '__main__': #父进程创建Queue,并传给各个子进程 q = Queue()
    proc_write1 = Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
    proc_write2 = Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
    proc_reader = Process(target=proc_read,args=(q,)) #启动子进程,写入 proc_write1.start()
    proc_write2.start()

    proc_reader.start() #等待proc_write1结束 proc_write1.join()
    proc_write2.join() #proc_raader进程是死循环,强制结束 proc_reader.terminate() 
  • 运行截图:

1.2 Pipe通信机制,

* Pipe常用于两个进程,两个进程分别位于管道的两端

* Pipe方法返回(conn1,conn2)代表一个管道的两个端,Pipe方法有duplex参数,默认为True,即全双工模式,若为FALSE,conn1只负责接收信息,conn2负责发送,

* send和recv方法分别为发送和接收信息。

#!coding:utf-8 import multiprocessing import os,time,random #写数据进程执行的代码 def proc_send(pipe,urls): #print 'Process is write....' for url in urls: print 'Process is send :%s' %url
        pipe.send(url)
        time.sleep(random.random()) #读数据进程的代码 def proc_recv(pipe): while True:
        print('Process rev:%s' %pipe.recv())
        time.sleep(random.random()) if __name__ == '__main__': #父进程创建pipe,并传给各个子进程 pipe = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10) ]))
    p2 = multiprocessing.Process(target=proc_recv,args=(pipe[1],)) #启动子进程,写入 p1.start()
    p2.start()

    p1.join()
    p2.terminate() 
  • 运行结果;
阅读(1408) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~