免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1554 | 回复: 3
打印 上一主题 下一主题

一个让我纠结了2天的python脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-08 21:58 |只看该作者 |倒序浏览
class a:
    def __init__(self):
        self.a = 0
    def greet(self):
        self.luncher()
    def luncher(self):
        luncher_box = []
        for i in range(3):
            luncher_box.append(Process(target=self.say_greet))
        for s in range(len(luncher_box)):
            luncher_box[s].start()
        for j in range(len(luncher_box)):
            luncher_box[j].join()
    def say_greet(self):
        if True:
            plus = 3
            self.a += plus
            print self.a

if __name__ == '__main__':
    a =a()
    a.greet()
    print a.a

# 我想从类外面访问a做了加法的值,不知道怎么弄,纯python新手

论坛徽章:
0
2 [报告]
发表于 2013-06-09 09:43 |只看该作者
if __name__ == '__main__':
    a =a()
    a.say_greet()
    print a.a

论坛徽章:
0
3 [报告]
发表于 2013-06-09 15:26 |只看该作者
回复 2# xmchenb

谢谢,我已经解决了,如果直接用say_greep方法没有问题,我这个必须调用greet方法
我的解决方法是用multiprocessing的Value模块,在父进程中将变量的类型设置为共享的


   

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
4 [报告]
发表于 2013-06-11 01:27 |只看该作者
本帖最后由 lolizeppelin 于 2013-06-11 14:20 编辑

首先...给a加数值

__setitem__

__getitem__

比较好用

你的Process函数是multiprocessing的Process?
你这里面应该要用线程而不是进程吧?

你新创建进程当然原来的self.a没有了啊,用线程才可以。
你的解决方法实际效果应该是设置了共享内存,你那个地方的正常写法应该使用线程才对的。


————————————————分割线————————————————

认真想了下,楼主你出现这个问题的原因在于你不知道 线程和子进程的区别
上你应该先用下os.fork之类的基础函数再去用multiprocessing的,不然你都只能照着别人的写法写而不知道为什么这样写的

子进程和线程的区别就在于是否共享主进程的变量

你的代码其实就想执行3个say_greet,你用multiprocessing.Process(底层其实就是os.fork了)其实就是复制了say_greet这段函数的内存成了新的进程
这个子进程里的"a"和原来主进程里的"a"根本就不是一个,也不在一个内存空间里(你一楼的代码里子进程里因为没有luncher,所以连值都没有),当然数值都不一样的
正好这有一篇分析multiprocessing的文章http://bbs.csdn.net/topics/340142877

如果你想这个新进程和主进程里的a一样,那么就需要用到“进程间通信”
常用的进程间通信
1、最常用的就是套接字socket
2、共享内存——你那个multiprocessing的value模块应该就是实现了这个——写代码这个方法用得比较少的,共享内存的锁要比多线程跟麻烦,所以一般都少用共享内存——这是我的理解,反正没见我们后台linux程序员用这个的,初学者不建议研究这里,当然我也是初学者。


如果你这个say_greet不使用子进程直接用线程来启动,就不会出现你说的问题。
实际正常写这样的代码正常反应都是用线程来写,除非你这里是刻意想测试multiprocessing的value模块。
总体来说,你的问题还是你没了解线程进程就开始用multiprocessing这类高级模块造成的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP