在Python进程之间共享具有对Tasklet(协程)具有写访问权的嵌套对象?

mertyildiran

如何在具有Tasklet(协程)的写访问权限的Python进程之间共享嵌套对象?

这是一个简化的示例,上面有一个类似的例子,正是我为正确回答这个问题而写的。

首先,请使用以下命令安装greenlet软件包:sudo pip install greenlet

在下面的示例中:

  • 变量Nature引用的实例habitat
  • 这个Nature类的实例有一个实例变量,称为animals
  • 在初始化Nature该类实例的同时,Animal创建了8个不同的实例并将其附加到animals实例变量。现在,如果我是对的,Nature该实例是一个嵌套对象。
  • 作为最后一步,live实例的实例函数Animal将使用greenlet程序包的switch()函数进行随机切换,直到global_counter达到1000。此live函数将随机更改limbs实例的实例变量的值Animal

greentest.py

import random
from greenlet import greenlet

global_counter = 0

class Animal():

    def __init__(self,nature):
        self.limbs = 0
        nature.animals.append(self)
        self.tasklet = greenlet(self.live)

    def live(self,nature):
        global global_counter
        while True:
            self.limbs = random.randint(1, 10)
            global_counter += 1
            if global_counter > 1000:
                break
            random.sample(nature.animals,1)[0].tasklet.switch(nature)

class Nature():

    def __init__(self,how_many):
        self.animals = []
        for i in range(how_many):
            Animal(self)
        print str(how_many) + " animals created."
        self.animals[0].live(self)

结果是:

>>> import greentest
>>> habitat = greentest.Nature(8)
8 animals created.
>>> habitat.animals[0].limbs
3
>>> greentest.global_counter
1002

正常工作。改变的值limbsglobal_counter(非零)

但是当我加上multiprocessing等式时;

greentest2.py

import random
import multiprocessing
from greenlet import greenlet

global_counter = 0

class Animal():

    def __init__(self,nature):
        self.limbs = 0
        nature.animals.append(self)
        self.tasklet = greenlet(self.live)

    def live(self,nature):
        global global_counter
        while True:
            self.limbs = random.randint(1, 10)
            global_counter += 1
            if global_counter > 1000:
                break
            random.sample(nature.animals,1)[0].tasklet.switch(nature)

class Nature():

    def __init__(self,how_many):
        self.animals = []
        for i in range(how_many):
            Animal(self)
        print str(how_many) + " animals created."
        #self.animals[0].live(self)
        jobs = []
        for i in range(2):
            p = multiprocessing.Process(target=self.animals[0].live, args=(self,))
            jobs.append(p)
            p.start()

结果与预期不同:

>>> import greentest2
>>> habitat = greentest2.Nature(8)
8 animals created.
>>> habitat.animals[0].limbs
0
>>> greentest2.global_counter
0

两者的值limbsglobal_counter不变(零)。我认为这是因为Animal类的实例global_counter并不在进程之间共享。那么,如何在进程之间共享Nature该类实例或这些Animal实例呢?

加成根据@noxdafox的答案;

greentest3.py

import random
import multiprocessing
from greenlet import greenlet

global_counter = multiprocessing.Value('i', 0)

class Animal():

    def __init__(self,nature):
        self.limbs = 0
        nature.animals.append(self)
        self.tasklet = greenlet(self.live)

    def live(self,nature):
        global global_counter
        while True:
            self.limbs = random.randint(1, 10)
            global_counter.value += 1
            if global_counter.value > 1000:
                break
            random.sample(nature.animals,1)[0].tasklet.switch(nature)

class Nature():

    def __init__(self,how_many):
        self.animals = []
        for i in range(how_many):
            Animal(self)
        print str(how_many) + " animals created."
        #self.animals[0].live(self)
        jobs = []
        for i in range(2):
            p = multiprocessing.Process(target=self.animals[0].live, args=(self,))
            jobs.append(p)
            p.start()

然后结果是:

>>> import greentest3
>>> habitat = greentest3.Nature(8)
8 animals created.
>>> habitat.animals[0].limbs
0
>>> greentest3.global_counter.value
1004

我非常清楚global_counter可以使用此方法共享,因为它是整数,但是我实际上是在问如何在进程之间共享NatureAnimal的实例

Noxdafox

不同的进程不共享它们的内存。

如果您需要共享的是单个变量,则可以使用multiprocessing.Value

import multiprocessing

def function(counter):
    counter.value += 1

counter = multiprocessing.Value('i')
p = multiprocessing.Process(target=function, args=(counter))
p.start()
p.join()

编辑:根据更新答复。

没有抽象机制允许共享内存中的整个对象。共享内存通常被实现为一个简单的数组,一旦获取资源,进程就可以在其中进行读/写操作。

而且,OOP和线程/多处理不能很好地融合在一起。恕我直言,应被视为反模式。在复杂对象之上,您可以添加并发访问和修改其属性。这是进行冗长乏味的调试会话的一种方式。

推荐的模式是使用消息队列。将线程和进程想象成孤立的实体,可以通过特定的渠道进行通信,从而大大简化了问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

与虚拟机共享具有写访问权的根文件夹是否很危险?

来自分类Dev

如何在仍然对Parse对象具有写访问权的同时,防止用户编辑特定列?

来自分类Dev

如何检查谁对Github上的公共组织的存储库具有写访问权?

来自分类Dev

具有Kotlin协程的FusedLocationProviderClient

来自分类Dev

Heroku没有看到我不拥有的存储库,但是我具有写访问权

来自分类Dev

.net中具有管理对象的线程之间的特权

来自分类Dev

.net中具有管理对象的线程之间的特权

来自分类Dev

允许普通用户在CIFS共享上具有写访问权限

来自分类Dev

没有对$ HOME目录的写访问权

来自分类Dev

如何在Swift中为协议的实现者提供读访问权,而其他人则具有写访问权

来自分类Dev

在 Python 中的多个进程之间共享存储对象的字典

来自分类Dev

如何在具有命名管道的进程之间进行转发?

来自分类Dev

暂停Kotlin协程,直到流具有特定值

来自分类Dev

在进程之间共享内核对象

来自分类Dev

在工作进程之间共享对象

来自分类Dev

在协程之间共享变量

来自分类Dev

没有对 samba 共享的写访问权限

来自分类Dev

Python在进程之间共享锁

来自分类Dev

ResourcesCompat构造函数具有私有访问权

来自分类Dev

是否可以在azure blob存储中为给定目录生成具有写许可权的SAS(共享访问签名)

来自分类Dev

Robocopy访问被拒绝,尽管具有完全控制权?

来自分类Dev

拥有所有权和借用以及在多个线程之间共享实例的麻烦

来自分类Dev

在Python中创建具有嵌套属性的空对象

来自分类Dev

在C#进程之间共享对象的推荐方法

来自分类Dev

在进程之间修改共享的dict对象不起作用

来自分类Dev

进程之间共享内存

来自分类Dev

如何在C中的进程之间共享带有指针的结构?

来自分类Dev

如何使用ProcessPool有效地在进程之间共享字典和列表

来自分类Dev

在资源有限的不同进程之间建立共享内存?

Related 相关文章

  1. 1

    与虚拟机共享具有写访问权的根文件夹是否很危险?

  2. 2

    如何在仍然对Parse对象具有写访问权的同时,防止用户编辑特定列?

  3. 3

    如何检查谁对Github上的公共组织的存储库具有写访问权?

  4. 4

    具有Kotlin协程的FusedLocationProviderClient

  5. 5

    Heroku没有看到我不拥有的存储库,但是我具有写访问权

  6. 6

    .net中具有管理对象的线程之间的特权

  7. 7

    .net中具有管理对象的线程之间的特权

  8. 8

    允许普通用户在CIFS共享上具有写访问权限

  9. 9

    没有对$ HOME目录的写访问权

  10. 10

    如何在Swift中为协议的实现者提供读访问权,而其他人则具有写访问权

  11. 11

    在 Python 中的多个进程之间共享存储对象的字典

  12. 12

    如何在具有命名管道的进程之间进行转发?

  13. 13

    暂停Kotlin协程,直到流具有特定值

  14. 14

    在进程之间共享内核对象

  15. 15

    在工作进程之间共享对象

  16. 16

    在协程之间共享变量

  17. 17

    没有对 samba 共享的写访问权限

  18. 18

    Python在进程之间共享锁

  19. 19

    ResourcesCompat构造函数具有私有访问权

  20. 20

    是否可以在azure blob存储中为给定目录生成具有写许可权的SAS(共享访问签名)

  21. 21

    Robocopy访问被拒绝,尽管具有完全控制权?

  22. 22

    拥有所有权和借用以及在多个线程之间共享实例的麻烦

  23. 23

    在Python中创建具有嵌套属性的空对象

  24. 24

    在C#进程之间共享对象的推荐方法

  25. 25

    在进程之间修改共享的dict对象不起作用

  26. 26

    进程之间共享内存

  27. 27

    如何在C中的进程之间共享带有指针的结构?

  28. 28

    如何使用ProcessPool有效地在进程之间共享字典和列表

  29. 29

    在资源有限的不同进程之间建立共享内存?

热门标签

归档