多进程进程间通讯multiprocessing

#!/usr/bin/env python
# Author:Zhangmingda
import queue,threading
from multiprocessing import Process,Queue
def f(q):
    q.put([234,None,‘Hello‘])
if __name__ == ‘__main__‘:
    q = queue.Queue() #使用线程队列运行报错TypeError: can‘t pickle _thread.lock objects
    p = Process(target=f,args=(q,)) #启动一个子进程
    # p = threading.Thread(target=f,) #启动线程直接共享主进程内存
    p.start()
    print(q.get())
    p.join()

线程报错

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day10/进程间通信?.py
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/Python3_study/day10/进程间通信?.py", line 13, in <module>
    p.start()
  File "C:\Program Files\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Program Files\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can‘t pickle _thread.lock objects

运行报错效果

#!/usr/bin/env python
# Author:Zhangmingda
import queue,threading
from multiprocessing import Process,Queue
def f(q):
    q.put([234,None,‘Hello‘])
if __name__ == ‘__main__‘:
    # q = queue.Queue() #使用线程队列运行报错TypeError: can‘t pickle _thread.lock objects
    q = Queue() #进程队列
    p = Process(target=f,args=(q,)) #启动一个子进程
    # p = threading.Thread(target=f,) #启动线程直接共享主进程内存
    p.start()
    print(q.get())
    p.join()

进程间通讯

进程间通讯原理:本例中等于将父进程中的q克隆了一份给子进程,子进程进行了序列化,在子进程中执行后又反序列化给父进程。所以在父进程中能够得到子进程对父进程中数据的修改结果。

C:\Users\Administrator\Desktop\Python3_study\venv\Scripts\python.exe C:/Users/Administrator/Desktop/Python3_study/day10/进程间通信?.py
[234, None, ‘Hello‘]

Process finished with exit code 0

运行效果

原文地址:https://www.cnblogs.com/zhangmingda/p/9374998.html

时间: 2024-10-10 15:01:17

多进程进程间通讯multiprocessing的相关文章

【进程间通讯与进程池】 -- 2019-08-11 18:46:25

原文: http://106.13.73.98/__/4/ 目录 一.队列 二.管道 三.进程间数据共享 四.进程池 进程间通讯:IPC(Inter-Process Communication) 一.队列: 队列:先进先出(First In First Out)简称 FIFO 栈:先进后出(First In Last Out)简称 FILO 1. multiprocessing.Queue模块 用于创建共享的进程队列,Queue是多进程安全的队列,可以实现对进程之间的数据传递,队列底层是使用管道

【进程间通讯与进程池】 -- 2019-08-16 18:12:52

原文: http://blog.gqylpy.com/gqy/230 " 目录 一.队列 二.管道 三.进程间数据共享 四.进程池 进程间通讯:IPC(Inter-Process Communication) 一.队列: 队列:先进先出(First In First Out)简称 FIFO 栈:先进后出(First In Last Out)简称 FILO 1. multiprocessing.Queue模块 用于创建共享的进程队列,Queue是多进程安全的队列,可以实现对进程之间的数据传递,队列

【进程间通讯与进程池】 &#223572;

原文: http://blog.gqylpy.com/gqy/230 " 目录 一.队列 二.管道 三.进程间数据共享 四.进程池 进程间通讯:IPC(Inter-Process Communication) 一.队列: 队列:先进先出(First In First Out)简称 FIFO 栈:先进后出(First In Last Out)简称 FILO 1. multiprocessing.Queue模块 用于创建共享的进程队列,Queue是多进程安全的队列,可以实现对进程之间的数据传递,队列

C#进程间通讯技术-整理。

原文:C#进程间通讯技术-整理. 扩展阅读:http://www.cnblogs.com/joye-shen/archive/2012/06/16/2551864.html 一.进程间通讯的方式 1)共享内存 包括:内存映射文件,共享内存DLL,剪切板. 2)命名管道及匿名管道 3)消息通讯 4)利用代理方法.例如SOCKET,配置文件,注册表方式. 等方式. 方法一:通讯. 进程间通讯的方式有很多,常用的有共享内存(内存映射文件.共享内存DLL.剪切板等).命名管道和匿名管道.发送消息等几种方

linux_c开发(5-1)进程间通讯_进程间通讯概念

目的:为什么进程间需要通信? 1.数据传输 一个进程需要将他的数据发送给另外一个进程. 2.资源共享 多进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个或一组进程发送消息,通知他们发生了某种事件. 4.进程控制 有些进程希望完全控制另一个进程的执行(eg:debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. 发展: linux进程间通讯(IPC)由以下及部分发展而来: 1.UNIX间进程通讯 2.基于system v进程间通讯 3.POSIX进

进程间通讯的三种方式

# 进程间通讯 # 1.进程对列multiprocessing.Quere import multiprocessing, time def foo(q): time.sleep(1) print('son process', id(q)) q.put(123) q.put('alex') if __name__ == '__main__': q = multiprocessing.Queue() print('main process', id(q)) p = multiprocessing.

win32进程间通讯--共享内存

小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 1 hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)szName); 2.在需要进行数据共享的地方映射缓存区视图,将要写入的数据放入pbuf 1 pBuf = (c

linux进程间通讯-System V IPC 信号量

进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程