相关疑难解决方法(0)

如何在进程之间共享一个类?

我希望拥有全局对象,所有进程都以最小的锁定进行共享和更新.

import multiprocessing

class Counter(object):
  def __init__(self):
    self.value = 0

  def update(self, value):
    self.value += value


def update(counter_proxy, thread_id):
  counter_proxy.value.update(1)
  print counter_proxy.value.value, 't%s' % thread_id, \
    multiprocessing.current_process().name
  return counter_proxy.value.value

def main():
  manager = multiprocessing.Manager()
  counter = manager.Value(Counter, Counter())
  pool = multiprocessing.Pool(multiprocessing.cpu_count())
  for i in range(10):
    pool.apply(func = update, args = (counter, i))
  pool.close()
  pool.join()

  print 'Should be 10 but is %s.' % counter.value.value

if __name__ == '__main__':
  main()
Run Code Online (Sandbox Code Playgroud)

结果是 - 不是10而是零.看起来该对象的共享值未更新.如何锁定和更新此值?

0 t0 PoolWorker-2
0 t1 PoolWorker-3
0 t2 PoolWorker-5 …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing python-multiprocessing

11
推荐指数
1
解决办法
1万
查看次数

如何更新流程中的类成员?

我寻找了其他问题,这个未接受的答案问题是我能找到的唯一一个以某种方式涵盖了这个问题并且没有真正帮助的问题。另外,我需要它来处理进程,而不是线程。

因此,我从头开始编写了一个示例程序来展示我的问题,您应该能够粘贴它并且它将运行:

import multiprocessing
import time 

class Apple:
   def __init__(self, color):
      self.color = color

def thinkAboutApple(apple):
   while True:
      print(apple.color)
      time.sleep(2)

my_apple = Apple("red")
new_process = multiprocessing.Process(target=thinkAboutApple, args=(my_apple,))
new_process.start()
time.sleep(4)
print("new: brown")
my_apple.color = "brown"

#so that the program doesn't exit after time.sleep(4)
while True:
    pass
Run Code Online (Sandbox Code Playgroud)
# actual output | # wanted output
red             | red
red             | red
new: brown      | new: brown
red             | brown
red             | brown
Run Code Online (Sandbox Code Playgroud)

这告诉我,要么苹果处于一个奇怪的假设,它同时有两种颜色,要么 new_process' 苹果位于 ram 中的另一个位置,并与主进程中的苹果分开。

所以问题是:有没有办法让进程中的苹果指针指向同一个苹果,或者什么是Pythonic方法来保持所有进程中苹果的所有实例相同?如果我在许多进程中有相同的苹果,甚至更多进程没有苹果,我如何确保它们始终相同?

python multiprocessing python-3.x python-multiprocessing

6
推荐指数
1
解决办法
356
查看次数

Python 检查 isinstance multiprocessing.Manager().Queue()

我在 Windows 7 上使用 python 2.7 多重处理:

import multiprocessing as mp
from Queue import Queue
from multiprocessing.managers import AutoProxy

if __name__ == '__main__':
    manager = mp.Manager()
    myqueue = manager.Queue()

    print myqueue
    print type(myqueue)
    print isinstance(myqueue, Queue)
    print isinstance(myqueue, AutoProxy)
Run Code Online (Sandbox Code Playgroud)

输出:

<Queue.Queue instance at 0x0000000002956B08>
<class 'multiprocessing.managers.AutoProxy[Queue]'>
False
Traceback (most recent call last):
  File "C:/Users/User/TryHere.py", line 12, in <module> print 
  isinstance(myqueue, AutoProxy) TypeError: isinstance() arg 2 must be a 
  class, type, or tuple of classes and types
Run Code Online (Sandbox Code Playgroud)

我的问题是:我想检查变量是否是多处理队列的实例,我应该如何检查?

我已经提到过:

检查Python multiprocessing.Connection …

python multiprocessing

5
推荐指数
1
解决办法
1693
查看次数