pool.apply_async和全局变量

问题描述 投票:-1回答:1

因为我无法使用pool.apply_async和全局变量简单地运行程序,所以我需要帮助。我无法解决共享内存的问题。简短描述程序流程:

此程序应如何工作:变量config.variable是一个标志-默认为False。如果线程中出现问题,则应将该标志的值设置为Thru,将值True停止/暂停。换一种说法想法是异步过程中的失败应停止/暂停程序。

我厌倦了使用Multiprocessing Value和Manager进行某些操作,但是没有结果。我不知道这是我的失败,还是永远都行不通。我实在太弱了,无法解决这个问题。技能不足。自我学习很难。我读过类似的线程,例如Python share valuesPython 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?有人可以添加几行吗?

感谢您的帮助和解释。

python asynchronous global-variables apply threadpool
1个回答
0
投票

为需要它的人提供的解决方案。我从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)
© www.soinside.com 2019 - 2024. All rights reserved.