【发布时间】:2017-08-30 10:17:54
【问题描述】:
测试环境:
- Python 版本:3.5.1
- 操作系统平台:Ubuntu 16.04
- IDE:PyCharm 社区版 2016.3.2
我编写了一个简单的程序来测试过程安全。我发现subprocess2 在subprocess1 完成之前不会运行。看来实例变量self.count 是进程安全的。进程如何共享这个变量?他们会直接分享self吗?
另外一个问题是我在使用Queue的时候,必须手动使用multiprocessing.Manager来保证进程的安全,否则程序将无法按预期运行。(如果取消注释self.queue = multiprocessing.Queue(),该程序将无法正常运行,但是使用self.queue = multiprocessing.Manager().Queue() 是可以的。)
最后一个问题是为什么最终结果是900?我觉得应该是102。
很抱歉问了这么多问题,但我确实对这些东西很好奇。非常感谢!
代码:
import multiprocessing
import time
class Test:
def __init__(self):
self.pool = multiprocessing.Pool(1)
self.count = 0
#self.queue = multiprocessing.Queue()
#self.queue = multiprocessing.Manager().Queue()
def subprocess1(self):
for i in range(3):
print("Subprocess 1, count = %d" %self.count)
self.count += 1
time.sleep(1)
print("Subprocess 1 Completed")
def subprocess2(self):
self.count = 100
for i in range(3):
print("Subprocess 2, count = %d" %self.count)
self.count += 1
time.sleep(1)
print("Subprocess 2 Completed")
def start(self):
self.pool.apply_async(func=self.subprocess1)
print("Subprocess 1 has been started")
self.count = 900
self.pool.apply_async(func=self.subprocess2)
print("Subprocess 2 has been started")
self.pool.close()
self.pool.join()
def __getstate__(self):
self_dict = self.__dict__.copy()
del self_dict['pool']
return self_dict
def __setstate__(self, state):
self.__dict__.update(state)
if __name__ == '__main__':
test = Test()
test.start()
print("Final Result, count = %d" %test.count)
输出:
Subprocess 1 has been started
Subprocess 2 has been started
Subprocess 1, count = 0
Subprocess 1, count = 1
Subprocess 1, count = 2
Subprocess 1 Completed
Subprocess 2, count = 100
Subprocess 2, count = 101
Subprocess 2, count = 102
Subprocess 2 Completed
Final Result, count = 900
【问题讨论】:
-
类unix系统和Windows的规则不同。你在哪个平台上?
-
@tdelaney 抱歉缺少这些信息。添加了测试环境。谢谢。
标签: python multithreading python-3.x process multiprocessing