Как использовать многопроцессорность с процессом asyncio и подпроцессом командной строки?Python

Программы на Python
Ответить
Anonymous
 Как использовать многопроцессорность с процессом asyncio и подпроцессом командной строки?

Сообщение Anonymous »

Как я смогу запустить мультипроцесс, если одна из задач использует Asyncio, а другая задача использует для запуска подпроцесс?
Вот основная функция:
import asyncio
import aioprocessing
import multiprocessing
import subprocess

# local imports
import steam_bot

async def open_auth():
_ = await asyncio.create_subprocess_exec('wine', '/Users/vortex/Desktop/Steam Project/SDA/Steam Desktop Authenticator.exe')

async def start_bot(q):
p = aioprocessing.AioProcess(target=steam_bot.main)
p.start()
await p.join()

if __name__ == "__main__":
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(open_auth()),
asyncio.ensure_future(start_bot()),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

Steam Desktop Authenticator.exe использует https://github.com/Jessecar96/SteamDesktopAuthenticator и представляет собой процесс, который генерирует графический интерфейс и не имеет определенной последовательности остановки. (обратите внимание, что команда предназначена для запуска exe на Mac с использованием Wine, команда работает правильно).
Вот Steam_bot, использующий пакет Steamio:
import steam

class MyClient(steam.Client):
async def on_ready(self):
print("------------")
print("Logged in as")
print("Username:", self.user)
print("ID:", self.user.id64)
print("Friends:", len(await self.user.friends()))
print("------------")

async def on_message(self, message: steam.Message):
# we do not want the bot to reply to itself
if message.author == self.user:
return

if message.content.startswith("!hello"):
await message.channel.send(f"Hello {message.author}")

def main():
client = MyClient()
client.run("username", "password")

Ошибки обычно включают объект nonetype, который нельзя использовать в await, возникающий с .create_subprocess_exec() или проблему, указывающую, что steam_bot не содержит переменных, которые определены при инициализации класса (поэтому это не может быть проблемой).
Вполне может возникнуть проблема с тем, как я запускаю программу с помощью aioprocess. Я столкнулся с препятствием, пытаясь устранить ошибки такого типа. Мне нужна помощь в попытке запустить эти два типа программ в одной основной программе.
Обновление на основе предложения @dano
import sys
import asyncio
import aioprocessing
import multiprocessing
from concurrent.futures import ProcessPoolExecutor
#from multiprocessing import Process, Queue
import subprocess

# local imports
import api
import steam_bot

def open_auth():
subprocess.run(['wine', '/Users/vortex/Desktop/Steam Project/SDA/Steam Desktop Authenticator.exe'])

async def run_api(q):
p = aioprocessing.AioProcess(target=api.main, args=(q, ))
p.start()
await p.join()

def start_bot(q):
steam_bot.main(q)

async def main():
loop = asyncio.get_running_loop()
queue = aioprocessing.AioQueue()

with ProcessPoolExecutor() as pool:
open_auth_result = await loop.run_in_executor(pool, open_auth)
bot_result = await loop.run_in_executor(pool, start_bot, queue)
#api_result = await loop.run_in_executor(pool, run_api, queue)

if __name__ == "__main__":
asyncio.run(main())

Текущая проблема заключается в том, что похоже, что очередь вызывает ошибки, но, несмотря на это, у меня все еще есть следующая проблема: (кажется, это проблема с запуском бота, но кажется, что все
ошибки неверны)
concurrent.futures.process._RemoteTraceback:
"""
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 415, in runner
await self.login(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 563, in login
await self._login(SteamWebSocket.from_client, refresh_token=refresh_token or self.refresh_token)
^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 241, in refresh_token
return None if self.ws is None else self.ws.refresh_token
^^^^^^^
AttributeError: 'MyClient' object has no attribute 'ws'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/concurrent/futures/process.py", line 263, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/vortex/Developer/tf2/tf2mart/test_temp2.py", line 37, in start_bot
steam_bot.main(q)
File "/Users/vortex/Developer/tf2/steam_bot.py", line 220, in main
client.run("Username", "Password")
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 418, in run
asyncio.run(runner(), debug=debug)
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 414, in runner
async with self:
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 362, in __aexit__
if not self.is_closed():
^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/steam/client.py", line 266, in is_closed
return self._closed
^^^^^^^^^^^^
AttributeError: 'MyClient' object has no attribute '_closed'. Did you mean: 'close'?
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/Users/vortex/Developer/tf2/tf2mart/test_temp2.py", line 50, in
asyncio.run(main())
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/Users/vortex/Developer/tf2/tf2mart/test_temp2.py", line 44, in main
bot_result = await loop.run_in_executor(pool, start_bot)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'MyClient' object has no attribute '_closed'


Подробнее здесь: https://stackoverflow.com/questions/798 ... subprocess
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»