pool.apply_async 和全局变量
pool.apply_async and global variable
因为我无法运行 简单地使用pool.apply_async 和全局变量进行编程,所以我需要帮助。我无法解决共享内存的问题。
简短描述程序流程:
这个程序应该如何工作:
变量 config.variable 是一个标志 - 默认为 False。如果线程出现问题,该标志的值应设置为 Thru,值 True 应 stop/Pause。
换一种说法
想法是在异步过程中失败应该 stop/pause 程序。
我厌倦了对多处理值和管理器做一些事情但没有结果。我不知道这是我的失败还是永远行不通。我太弱了,无法解决这个问题。技能不够。自学很难。
我读过类似的线程,例如这个 or 但是有关于将参数传递给线程的内容。大多数其他示例使用 Value 或 Manager,但使用 Process 并且此解决方案对我有用。
问题是:
我可以为 pool.apply_async 使用 Value 或 Manager 吗?如何更改全局变量。
我应该为布尔值 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)
因为我无法运行 简单地使用pool.apply_async 和全局变量进行编程,所以我需要帮助。我无法解决共享内存的问题。 简短描述程序流程:
这个程序应该如何工作: 变量 config.variable 是一个标志 - 默认为 False。如果线程出现问题,该标志的值应设置为 Thru,值 True 应 stop/Pause。 换一种说法 想法是在异步过程中失败应该 stop/pause 程序。
我厌倦了对多处理值和管理器做一些事情但没有结果。我不知道这是我的失败还是永远行不通。我太弱了,无法解决这个问题。技能不够。自学很难。
我读过类似的线程,例如这个
问题是: 我可以为 pool.apply_async 使用 Value 或 Manager 吗?如何更改全局变量。 我应该为布尔值 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)