我希望使用真正的多线程在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
我怎样才能简单 - 请帮助:
我擅长线程/并行,但不知道如何使用 Python 线程(相当多处理) - 它看起来是可能的。
答案 0 :(得分:0)
多处理不是线程,因此您的示例并不完全符合您的预期。 multiprocessing
使用fork,因此您的子进程在对象副本上运行正常,然后退出放弃更改。
您可以做的是在callback
上使用apply_async
来了解正在发生的事情,但您不能只分享您的成员变量。您可以使用评论中提到的value, array or manager在进程之间共享状态。
所以重申一下,如果你想要线程使用threadig(它仍然存在),但如果你想要并行化,那么你必须在Python中使用多处理,但是你必须调整你的设计,因为你没有相同的访问权限与线程一样对你的子进程。
编辑:您也可以使用从apply_async
返回的result对象来获取结果,这很可能会为您提供所需内容。
希望这有帮助。