Python论坛  - 讨论区

标题:[python-chinese] 难题:子进程中如何访问父进程中的内存变量

2005年12月08日 星期四 23:47

amingsc amingsc at 163.com
Thu Dec 8 23:47:41 HKT 2005

我想在子进程中访问父进程中的内存变量,应该怎么做?

我尝试过用fork产生子进程,这个时候子进程会复制一份父进程的数据
所以可以直接访问需要的变量;但是不巧的是我看书上讲fork不可移植
(不适用于windows,还没试过),所以不是好的选择;

上次limodou讲过可以用参数传递,但是我发现不管是参数传递,还是用pipe
都是以流的方式传递的数据,而这里需要传递的变量是一个很复杂的类对象,
不能用字符串表示,所以也不行;

除此以外,还有什么办法呢?盼望高手解答,谢过先!

这里附带描述一下上次问过的问题:
我本来的目的是要在主程序中运行一段python脚本,而且该脚本需要访问主程序中的
数据,先想用线程的方式实现,后来问了很多人都说线程不能强行中止(这是我的
程序中必须有的),所以才转向进程来实现

-- 
中文人工智能讨论组
http://groups.google.com/group/ai-chinese


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 08:54

limodou limodou at gmail.com
Fri Dec 9 08:54:14 HKT 2005

2005/12/8, amingsc <amingsc at 163.com>:
> 我想在子进程中访问父进程中的内存变量,应该怎么做?
>
> 我尝试过用fork产生子进程,这个时候子进程会复制一份父进程的数据
> 所以可以直接访问需要的变量;但是不巧的是我看书上讲fork不可移植
> (不适用于windows,还没试过),所以不是好的选择;
>
> 上次limodou讲过可以用参数传递,但是我发现不管是参数传递,还是用pipe
> 都是以流的方式传递的数据,而这里需要传递的变量是一个很复杂的类对象,
> 不能用字符串表示,所以也不行;
>
> 除此以外,还有什么办法呢?盼望高手解答,谢过先!
>
> 这里附带描述一下上次问过的问题:
> 我本来的目的是要在主程序中运行一段python脚本,而且该脚本需要访问主程序中的
> 数据,先想用线程的方式实现,后来问了很多人都说线程不能强行中止(这是我的
> 程序中必须有的),所以才转向进程来实现
>

你的问题就是进程间通讯呀,方式很多,如信号量,共享内存,socket,消息,管道,文件。象你所说的复杂的对象传递,那完全可以将对象pickle到文件中,然后在其它进程中再还原。只不过要注意进程间的互拆操作。使用pickle或类似的方法,你还可以将得到的字符串通过socket,消息之类的方式进行传递。如果使用socket可以考虑使用xml-rpc或我的blog中介绍的spyro还有类似的模块都可以。方法很多的。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 09:51

xxmplus xxmplus at gmail.com
Fri Dec 9 09:51:41 HKT 2005

python支持soap不?

在 05-12-9,limodou<limodou at gmail.com> 写道:
> 2005/12/8, amingsc <amingsc at 163.com>:
> > 我想在子进程中访问父进程中的内存变量,应该怎么做?
> >
> > 我尝试过用fork产生子进程,这个时候子进程会复制一份父进程的数据
> > 所以可以直接访问需要的变量;但是不巧的是我看书上讲fork不可移植
> > (不适用于windows,还没试过),所以不是好的选择;
> >
> > 上次limodou讲过可以用参数传递,但是我发现不管是参数传递,还是用pipe
> > 都是以流的方式传递的数据,而这里需要传递的变量是一个很复杂的类对象,
> > 不能用字符串表示,所以也不行;
> >
> > 除此以外,还有什么办法呢?盼望高手解答,谢过先!
> >
> > 这里附带描述一下上次问过的问题:
> > 我本来的目的是要在主程序中运行一段python脚本,而且该脚本需要访问主程序中的
> > 数据,先想用线程的方式实现,后来问了很多人都说线程不能强行中止(这是我的
> > 程序中必须有的),所以才转向进程来实现
> >
>
> 你的问题就是进程间通讯呀,方式很多,如信号量,共享内存,socket,消息,管道,文件。象你所说的复杂的对象传递,那完全可以将对象pickle到文件中,然后在其它进程中再还原。只不过要注意进程间的互拆操作。使用pickle或类似的方法,你还可以将得到的字符串通过socket,消息之类的方式进行传递。如果使用socket可以考虑使用xml-rpc或我的blog中介绍的spyro还有类似的模块都可以。方法很多的。
>
> --
> I like python!
> My Blog: http://www.donews.net/limodou
> NewEdit Maillist: http://groups.google.com/group/NewEdit
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 09:54

Bruce Wang number5 at gmail.com
Fri Dec 9 09:54:09 HKT 2005

On 12/9/05, xxmplus <xxmplus at gmail.com> wrote:
>
> python支持soap不?
>
>
看这里
http://www.google.com/search?q=python+soap
有很多选择噢

--
simple is good
http://datastrategy.org/number5
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20051209/f43d4453/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 11:21

liyu liyu at ccoss.com.cn
Fri Dec 9 11:21:41 HKT 2005

amingsc 写道:

> 我在网上搜了一下,发现了一篇很好的文章“共享内存实现进程间大数据的交换”
> http://www.wezu.net/blog/article.asp?id=623
> (摘录于此以备以后需要的人查阅)
> 进程间通讯的方式有很多,常用的有共享内存、命名管道和匿名管道、发送消息 
> 等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接 
> 实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大 
> 数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另 
> 外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。 
> 这样,可供选择的通讯方式只剩下共享内存和发送消息两种。由于数据量比较 
> 大,这样在使用消息进行通讯时就无法通过消息参数将数据直接携带到接收方, 
> 只能以地址传送的方 式进行。当一个应用程序向另一个应用程序发送数据时将 
> 会发出 WM_COPYDATA系统 消息,因此可以考虑通过向消息队列插入WM_COPYDATA 
> 消息的方法来实现数据在进 程间的拷贝。
>   比之以上几种进程间通讯方法,共享内存有着明显的优势。共享内存是通过直 
> 接操作内存映射文件来进行的,而内存映射文件又是进行单机数据共享的最低层 
> 机制,前面几种数据交换方式在低层都是通过内存映射文件来进行的。因此使用 
> 共享内存可以以较小的开销获取较高的性能,是进行大数据量数据快速交换的最 
> 佳方案。
>
> 我的问题:
> 我想“共享内存”和“消息传送”应该是对我最佳的选择
> 上面的文章讲的是vc的实现,不知道python是怎么来实现“共享内存”的?python 
> 的 文档中哪个部分讲的是这个技术?
> 我认为limodou所讲的pickle文件的方法应该就是上面提到的所谓的“使用配置文 
> 件 和注册表”
> 的方法,对吗?
>
> limodou 写道:
>
>> 2005/12/8, amingsc <amingsc at 163.com>:
>>  
>>
>>> 我想在子进程中访问父进程中的内存变量,应该怎么做?
>>>
>>> ........
>>>
>>>   
>>
>>
>> 你的问题就是进程间通讯呀,方式很多,如信号量,共享内存,socket,消 
>> 息,管道,文件。象你所说的复杂的对象传递,那完全可以将对象pickle到文 
>> 件中,然后在其它进程中再还原。只不过要注意进程间的互拆操作。使用 
>> pickle或类似的方法,你还可以将得到的字符串通过socket,消息之类的方式 
>> 进行传递。如果使用socket可以考虑使用xml-rpc或我的blog中介绍的spyro还 
>> 有类似的模块都可以。方法很多的。
>>
>>  
>>
mmap模块呗,在windows/unix上都有实现,但好像mmap的行为有些不同。
看看文档8

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 11:22

amingsc amingsc at 163.com
Fri Dec 9 11:22:38 HKT 2005

我在网上搜了一下,发现了一篇很好的文章“共享内存实现进程间大数据的交换”
http://www.wezu.net/blog/article.asp?id=623
(摘录于此以备以后需要的人查阅)
进程间通讯的方式有很多,常用的有共享内存、命名管道和匿名管道、发送消息等 
几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现 
进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量 
数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管 
道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选 
择的通讯方式只剩下共享内存和发送消息两种。由于数据量比较大,这样在使用消 
息进行通讯时就无法通过消息参数将数据直接携带到接收方,只能以地址传送的方 
式进行。当一个应用程序向另一个应用程序发送数据时将会发出 WM_COPYDATA系统 
消息,因此可以考虑通过向消息队列插入WM_COPYDATA消息的方法来实现数据在进 
程间的拷贝。
   比之以上几种进程间通讯方法,共享内存有着明显的优势。共享内存是通过直 
接操作内存映射文件来进行的,而内存映射文件又是进行单机数据共享的最低层机 
制,前面几种数据交换方式在低层都是通过内存映射文件来进行的。因此使用共享 
内存可以以较小的开销获取较高的性能,是进行大数据量数据快速交换的最佳方案。

我的问题:
我想“共享内存”和“消息传送”应该是对我最佳的选择
上面的文章讲的是vc的实现,不知道python是怎么来实现“共享内存”的?python的 
文档中哪个部分讲的是这个技术?
我认为limodou所讲的pickle文件的方法应该就是上面提到的所谓的“使用配置文件 
和注册表”
的方法,对吗?

limodou 写道:

>2005/12/8, amingsc <amingsc at 163.com>:
>  
>
>>我想在子进程中访问父进程中的内存变量,应该怎么做?
>>
>>........
>>
>>    
>>
>
>你的问题就是进程间通讯呀,方式很多,如信号量,共享内存,socket,消息,管道,文件。象你所说的复杂的对象传递,那完全可以将对象pickle到文件中,然后在其它进程中再还原。只不过要注意进程间的互拆操作。使用pickle或类似的方法,你还可以将得到的字符串通过socket,消息之类的方式进行传递。如果使用socket可以考虑使用xml-rpc或我的blog中介绍的spyro还有类似的模块都可以。方法很多的。
>
>  
>
-- 
中文人工智能讨论组
http://groups.google.com/group/ai-chinese


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年12月09日 星期五 12:50

limodou limodou at gmail.com
Fri Dec 9 12:50:42 HKT 2005

2005/12/9, amingsc <amingsc at 163.com>:
> 我在网上搜了一下,发现了一篇很好的文章"共享内存实现进程间大数据的交换"
> http://www.wezu.net/blog/article.asp?id=623
> (摘录于此以备以后需要的人查阅)
> 进程间通讯的方式有很多,常用的有共享内存、命名管道和匿名管道、发送消息等
> 几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现
> 进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量
> 数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管
> 道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选
> 择的通讯方式只剩下共享内存和发送消息两种。由于数据量比较大,这样在使用消
> 息进行通讯时就无法通过消息参数将数据直接携带到接收方,只能以地址传送的方
> 式进行。当一个应用程序向另一个应用程序发送数据时将会发出 WM_COPYDATA系统
> 消息,因此可以考虑通过向消息队列插入WM_COPYDATA消息的方法来实现数据在进
> 程间的拷贝。
>    比之以上几种进程间通讯方法,共享内存有着明显的优势。共享内存是通过直
> 接操作内存映射文件来进行的,而内存映射文件又是进行单机数据共享的最低层机
> 制,前面几种数据交换方式在低层都是通过内存映射文件来进行的。因此使用共享
> 内存可以以较小的开销获取较高的性能,是进行大数据量数据快速交换的最佳方案。
>
> 我的问题:
> 我想"共享内存"和"消息传送"应该是对我最佳的选择
> 上面的文章讲的是vc的实现,不知道python是怎么来实现"共享内存"的?python的
> 文档中哪个部分讲的是这个技术?
> 我认为limodou所讲的pickle文件的方法应该就是上面提到的所谓的"使用配置文件
> 和注册表"
> 的方法,对吗?
>

pickle是python中将对象序列化的功能,即将对象变成一个字节流,可以保存在字符串中或文件中,需要时还可以读出来。这个象配置文件,但不是注册表。

--
I like python!
My Blog: http://www.donews.net/limodou
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号