Невозможно передать значения между процессами - PullRequest
0 голосов
/ 26 апреля 2020

Я некоторое время отлаживал свой код и обнаружил, что bash_shell(message,shell) не может передать словарь shell обратно в основной процесс. Словарь по-прежнему пуст, но когда я читаю (на самом деле, печать) shell в bash_shell(), он имеет значение. Что означает, может быть, потому что я передал значение переменной, но не псевдоним? Но я видел другие посты на других сайтах, люди делают это таким образом, и это прекрасно работает.

И я попытался сделать threading.Thread() вместо multiprocessing.Process(). Поток может передать значение обратно с помощью глобальных переменных (не пробовал метод параметров).

import multiprocessing,subprocess
# doing import stuff and blah blah blah
shell = dict()
shell['sh_out'] = ''
shell['py_out'] = ''
# code.... (in this part I also defined channel, guild, _globals, _locals,bot, etc...)
def bash_shell(msg,shell):
    global channel,guild,_globals,_locals
    try:
        proc = subprocess.Popen(msg.split(" "), stdout=subprocess.PIPE,text=True)
    except Exception as e:
        shell['sh_out'] = str(e) + '\n$'
        return
    (out, err) = proc.communicate()
    if err:
        shell['sh_out'] = '```\n' + str(out) + "\n```\nError: `" + str(err) + "`\n```\n$```"
    else:
        shell['sh_out'] = '```\n'+ str(out) + "\n$```"
    if len(rt) > 1988:
        f = open("samples/shoutput.txt","w")
        f.write(rt)
        f.close()
    return
#code.......
# @bot.event
def on_message(message):
    #again code......
    # if message.channel.name == 'bash':
        # p = multiprocessing.Process(target=bash_shell,args=[message,shell])
        p = multiprocessing.Process(target=bash_shell,args=['ls -al',shell])
        p.start()
        p.join(5)
        if p.is_alive():
            p.kill()
            shell['sh_out'] = "Enough fork bomb. Please don't try to hang the bot."
            p.join()
        if len(shell['sh_out']) > 1998:
            # await message.channel.send(file=discord.File(open("samples/shoutput.txt","r"),"output.txt"))
            shell['sh_out'] = ''
            return
        print(shell)
        # await message.channel.send(shell['sh_out'])
        shell['sh_out'] = ""
        return

on_message('a')

(примечание: если вам интересно, что я делаю, это просто бот, закодированный в discord.py. Код был изменен так, чтобы было проще понять и вызвать исключение.)

Так, что я сделал не так? Или есть лучшие способы сделать трюк? Почему он не может изменить словарь shell, но другие могут это сделать?

1 Ответ

1 голос
/ 26 апреля 2020

У вас есть две возможности:

1) Распределить пространство памяти между процессами

2) Использовать объект диспетчера, предоставляемый многопроцессорной библиотекой

Но для связи между процессами Вы можете использовать Очередь, упомянутую в этой замечательной статье:

https://www.geeksforgeeks.org/multiprocessing-python-set-2/amp/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...