因为我无法使用pool.apply_async和全局变量简单地运行程序,所以我需要帮助。我无法解决共享内存的问题。简短描述程序流程:
此程序应如何工作:变量config.variable是一个标志-默认为False。如果线程中出现问题,则应将该标志的值设置为Thru,将值True停止/暂停。换一种说法想法是异步过程中的失败应停止/暂停程序。
我厌倦了使用Multiprocessing Value和Manager进行某些操作,但是没有结果。我不知道这是我的失败,还是永远都行不通。我实在太弱了,无法解决这个问题。技能不足。自我学习很难。我读过类似的线程,例如Python share values或Python multiprocessing Pool.apply_async with shared variables (Value),但是关于将参数传递给线程。其他大多数示例都使用Value或Manager,但使用Process,此解决方案对我有用。
问题是:是否可以将Value或Manager用于pool.apply_async?如何更改全局变量。我应该对布尔True和False使用哪种类型的代码
我读到此:Sharing state between processes
[请帮助我,并告诉我该怎么写。我简单地附加代码。有人可以编辑它并添加缺少的行吗?我无法将apply_async更改为进程。
文件config.py
variable1 = False
文件main.py
import config
from multiprocessing import Pool
import time
import sys
def func2():
try:
config.variable1 = True
print('Global Variable in thread {}'.format(config.variable1))
except Exception as e:
print(e)
if __name__ == '__main__':
while 1:
time.sleep(1)
try:
pool = Pool(4)
pool.apply_async(func2)
pool.close()
pool.join()
except Exception as e:
print(e)
# print(config.variable1)
print('Global Variable in main loop {}'.format(config.variable1))
if config.variable1 is True:
sys.exit(0)
在这种情况下,如何使用Value或Manager?有人可以添加几行吗?
感谢您的帮助和解释。
为需要它的人提供的解决方案。我从16.6.1.4. Sharing state between processes¶
中编辑了示例from multiprocessing import Pool, Manager
import config
from threading import Thread
import time
def f(d):
if d['flag1'] is False:
d['flag1'] = True
else:
d['flag1'] = False
# l.reverse()
def stop():
print('stop')
while 1:
if config.variable1 is True:
break
if __name__ == '__main__':
manager = Manager()
print(config.variable1)
d = manager.dict()
thread1 = Thread(target = stop)
thread1.start()
while 1:
d['flag1'] = config.variable1
pool = Pool(4)
p = pool.apply_async(f, args=(d,))
pool.close()
pool.join()
config.variable1 = d['flag1']
print (d)
print(config.variable1)
if thread1.is_alive() is False:
break
time.sleep(3)