如何在Python中使用对象/类的多处理 - 简单的计数器?

时间:2015-02-19 12:17:57

标签: python python-multiprocessing

我希望使用真正的多线程在Python中加速程序。据我所知,我需要使用多处理,因为线程化在一个cpu上产生了不需要的线程并减慢了我的程序。

首先,我想用多处理编写简单的工作程序来修改对象实例。

让它成为反击因为简单来解释反应应该是什么。

# coding=utf-8
import multiprocessing
import copy_reg
import types

def pickle_method(method):
  # instance method
  if method.im_self is not None:
    return getattr, (method.im_self, method.im_func.func_name)
  # class method
  else:
    return getattr, (method.im_class, method.im_func.func_name)

copy_reg.pickle(types.MethodType, pickle_method)

COUNTS = 10

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

  def count_thread(self):
    # how to lock it?
    # how to share it?
    self.counter += 1

  def count(self):
    max_threads = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(max_threads)
    for i in range(COUNTS):
      # send to execute but how to lock?
      pool.apply_async(self.count_thread)
    pool.close()
    pool.join()

def main():
  counter = Counter()
  counter.count()
  assert counter.counter == COUNTS, (counter.counter)

if __name__ == '__main__':
    main()

这个程序的结果不是我想要的或者除了(应该是COUNTS = 10):

Traceback (most recent call last):
  File "C:/root/Dropbox/Private/PyCharm/learn_thread/thread_class_run.py", line 40, in <module>
    main()
  File "C:/root/Dropbox/Private/PyCharm/learn_thread/thread_class_run.py", line 37, in main
    assert counter.counter == COUNTS, (counter.counter)
AssertionError: 0

我怎样才能简单 - 请帮助:

  1. 将对象传递给其他&#34;进程/线程&#34;?
  2. 在其他&#34;进程/线程&#34;?
  3. 中锁定对象变量

    我擅长线程/并行,但不知道如何使用 Python 线程(相当多处理) - 它看起来是可能的。

1 个答案:

答案 0 :(得分:0)

多处理不是线程,因此您的示例并不完全符合您的预期。 multiprocessing使用fork,因此您的子进程在对象副本上运行正常,然后退出放弃更改。

您可以做的是在callback上使用apply_async来了解正在发生的事情,但您不能只分享您的成员变量。您可以使用评论中提到的value, array or manager在进程之间共享状态。

所以重申一下,如果你想要线程使用threadig(它仍然存在),但如果你想要并行化,那么你必须在Python中使用多处理,但是你必须调整你的设计,因为你没有相同的访问权限与线程一样对你的子进程。

编辑:您也可以使用从apply_async返回的result对象来获取结果,这很可能会为您提供所需内容。

希望这有帮助。