python多进程实现进程间通信实例

作者:HeatDeath 时间:2023-01-30 10:39:35 

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

multiprocessing.Queue()

以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

multiprcessing.Queue.put() 为 入队操作

multiprcessing.Queue.get() 为 出队操作

队列 线程 和 进程 安全

put(obj[, block[, timeout]])

将obj放入队列。 如果可选参数 block为True(默认值),timeout为None(默认值),则必要时阻止,直到空闲插槽可用。 如果超时是正数,它将阻止最多超时秒数,如果在该时间内没有空闲插槽可用,则会引发Queue.Full异常。 否则(块为False),如果空闲插槽立即可用,则将一个项目放在队列中,否则会引发Queue.Full异常(在这种情况下,忽略超时)。

get([block[, timeout]])

从队列中删除并返回一个项目。 如果可选的args块为True(默认值),超时为None(默认值),则在必要时阻止,直到项目可用。 如果超时为正数,则它将阻塞至多超时秒数,并在该时间内没有可用项目时引发Queue.Empty异常。 否则(block为False),如果一个项目立即可用,返回一个项目,否则会引发Queue.Empty异常(在这种情况下,忽略超时)。


#- * -coding: utf - 8 - * -
 from multiprocessing
import Process, Queue
import os
import time
import random

# 写数据进程执行的代码:
 def write(q):
 print('Process to write: %s' % os.getpid())
for value in ['A', 'B', 'C']:
 print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
 def read(q):
 print('Process to read: %s' % os.getpid())
while True:
 value = q.get()
print('Get %s from queue.' % value)

if __name__ == '__main__': #父进程创建Queue, 并传给各个子进程:
q = Queue()
pw = Process(target = write, args = (q, ))
pr = Process(target = read, args = (q, ))# 启动子进程pw, 写入:
 pw.start()# 启动子进程pr, 读取:
 pr.start()# 等待pw结束:
 pw.join()# pr进程里是死循环, 无法等待其结束, 只能强行终止:
 pr.terminate()

输出


Process to read: 5836
Process to write: 6472
Put A to queue...
Put B to queue...
Get A from queue.
Put C to queue...
Get B from queue.
Get C from queue.

Process finished with exit code 0

multiprocessing.Pipe()

Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程(或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。 当然,同时使用管道不同端的过程也不会有风险。

返回表示管道末端的一对Connection(conn1,conn2)对象。

如果duplex为True(默认),则管道是双向的。

如果duplex是False,那么管道是单向的:conn1只能用于接收消息,conn2只能用于发送消息。


#- * -coding: utf - 8 - * -
 from multiprocessing
import Process, Pipe

def f(conn):
 conn.send([42, None, 'hello'])
while True:
 print(conn.recv())

if __name__ == '__main__':
 parent_conn, child_conn = Pipe()
p = Process(target = f, args = (child_conn, ))
p.start()
print parent_conn.recv()# prints "[42, None, 'hello']"
parent_conn.send('666')
p.terminate()

输出:


[42, None, 'hello']
666

Process finished with exit code 0

总结

Python编程实现蚁群算法详解

python绘制铅球的运行轨迹代码分享

Python中turtle作图示例

如有不足之处,欢迎留言指出。

来源:http://blog.csdn.net/heatdeath/article/details/72844120

标签:python,多进程编程实例
0
投稿

猜你喜欢

  • tkinter如何实现label超链接调用浏览器打开网址

    2023-04-05 15:08:20
  • PHP正则表达式替换<pre>标签外的内容

    2023-05-22 10:47:12
  • 常见的在Python中实现单例模式的三种方法

    2022-11-08 01:42:09
  • python使用xlrd实现检索excel中某列含有指定字符串记录的方法

    2021-04-23 12:41:26
  • 分面搜索(Faceted Search)

    2009-07-31 12:44:00
  • 深入解析python中的实例方法、类方法和静态方法

    2022-07-23 09:05:57
  • Python 中的函数装饰器和闭包详解

    2021-08-03 17:52:40
  • python爬取代理ip的示例

    2022-01-20 11:41:12
  • 加密处理使密码更安全[CFS编码加密]

    2008-03-19 13:30:00
  • Mysql查询时间区间日期列表实例代码

    2024-01-17 16:17:32
  • MySQL 8.0 之不可见列的基本操作

    2024-01-18 17:32:41
  • python使用装饰器作日志处理的方法

    2021-08-17 03:20:32
  • 微信小程序实现星星评价效果

    2023-08-24 10:04:45
  • go语言静态库的编译和使用方法

    2024-05-09 09:40:05
  • Python实现获取磁盘剩余空间的2种方法

    2023-11-20 23:53:29
  • 基于JS实现Android,iOS一个手势动画效果

    2024-04-28 09:36:41
  • select @@identity的应用(得到刚插入数据的ID)

    2009-09-10 11:24:00
  • 详解vue项目中调用百度地图API使用方法

    2024-05-09 09:38:29
  • 基于Python编写简易文字语音转换器

    2023-12-28 19:24:54
  • python实现三次密码验证的示例

    2022-01-24 16:34:25
  • asp之家 网络编程 m.aspxhome.com