使用python更改线程中的对象值 [英] change object value in threads using python

查看:91
本文介绍了使用python更改线程中的对象值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Python很陌生,因此可能会问一个简单的问题.

I am very new to Python, thus am possibly asking a simple question.

我正在用Python编写多进程代码:

I am wrting a multiprocess code with Python:

from multiprocessing import Process
from multiprocessing import Queue

class myClass(object):

    def __init__(self):
        self.__i = 0
        self.__name = 'rob'
        return

    def target_func(self, name, q):
        self.__name = name
        print 'Hello', self.__name
        self.__i += 1
        print self.__i
        q.put([self.__i, self.__name])
        return

    def name(self):
        return self.__name

    def i(self):
        return self.__i


if __name__ == '__main__':
    mc = myClass()

    q = Queue()

    p = Process(target = mc.target_func, args = ('bob', q,))
    p.start()
    ret = q.get()
    p.join()

    p2 = Process(target = mc.target_func, args = ('tom', q,))
    p2.start()
    ret = q.get()
    p2.join()

我希望打印出来的是

Hello bob
1
Hello tom
2

但实际上,打印输出是

Hello bob
1
Hello tom
1    <------------------ Why it's not 2?

我可以知道我做错了什么吗?

May I know what am I wrong?

非常感谢.

推荐答案

target_func. mc复制到每个子进程;不能在进程之间共享.

target_func is called in separated process. mc is copied to each subprocess; not shared between processes.

使用线程,您将获得预期的结果.为了安全起见,您应该使用锁;我在以下代码中省略了它.

Using Thread, you will get expected(?) result. For safety you should use lock; I omitted it in following code.

from threading import Thread
from Queue import Queue

....


if __name__ == '__main__':
    mc = myClass()

    q = Queue()

    p = Thread(target = mc.target_func, args = ('bob', q,))
    p.start()
    ret = q.get()
    p.join()

    p2 = Thread(target = mc.target_func, args = ('tom', q,))
    p2.start()
    ret = q.get()
    p2.join()

这篇关于使用python更改线程中的对象值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆