Python Запуск нескольких процессов одновременно - PullRequest
0 голосов
/ 22 февраля 2019

Я надеюсь, что это не дубликат, но я знаю, что я так близок к тому, чтобы выяснить это, я просто не могу понять последний бит.

У меня есть эта проблема в Python запуска двухфункционирует одновременно.Мне нужно запустить "top" (команда linux), а также выполнить каждую новую команду параллельно.Вот пример.

Быстрый дискорд-бот, которого я пытаюсь вызвать:

import subprocess
import discord

@client.event #Event listener
def on_message(message):
   if message.content.startswith('top'):
       subprocess.call(['top'])

Теперь этот фрагмент будет делать то, что я хочу, он будет называться дочерним процессомсверху и оставь это работающим.Проблема в том, что я не могу запустить другой подпроцесс таким же образом.Если я добавлю этот код:

@client.event #Event listener
def on_message(message):
   if message.content.startswith('top'):
       subprocess.call(['top'])

   if message.content.startswith('kill top')
       subprocess.call('killall', 'top')

Это простой пример, но он аналогичен любой программе, которую необходимо оставить работающей.

Любая попытка запустить вторую команду после уже запускасверху, это приведет к сбою бота, и я не могу получить сообщение об ошибке.Я думаю, что это либо дизайн внутри библиотеки Discord, которого я не вижу, либо мне нужно каким-то образом включить многопоточность, хотя я не уверен, с чего лучше начинать.

1 Ответ

0 голосов
/ 22 февраля 2019

В asyncio есть функция для обработки асинхронного подпроцесса.Вы можете использовать эту библиотеку, потому что вы работаете с discord.py, поэтому я рекомендую вам использовать ее.

Ссылка: https://docs.python.org/3/library/asyncio-subprocess.html

@client.event
def on_message(message):
    if message.content.startswith('top'):
        proc = await asyncio.create_subprocess_shell(
            'top',
            stdout=asyncio.subprocess.PIPE
            stderr=asyncio.subprocess.PIPE)
        stdout, stderr = await proc.communicate()

    if message.content.startswith('kill top'):
        proc = await asyncio.create_subprocess_shell(
            'killall top',
            stdout=asyncio.subprocess.PIPE
            stderr=asyncio.subprocess.PIPE)
        stdout, stderr = await proc.communicate()
...