Как уменьшить использование процессора ProcessPoolExecutor с помощью asyncio?

Я использую ProcessPoolExecutor, как показано ниже

def main(argv):
    set_argv(argv)
    # running code. Loop button click, enter text, submit.
if __name__ == '__main__':
    executer = ProcessPoolExecutor(max_workers=9)
    argvs = ["D", "E", "F", "G", "H", "I", "J", "K", "L"]
    for argv in argvs:
        executer.submit(main,argv)

Но этот код использует ЦП на 100%, и каждый процесс занимает в два раза больше времени, чтобы завершить только один процесс.

Поэтому я хочу использовать asyncio, чтобы уменьшить нагрузку на ЦП. но приведенный ниже код выдает ошибку.

async def async_set():
    coroutines = []
    argvs = ["D", "E", "F", "G", "H", "I", "J", "K", "L"]
    fts = [loop.run_in_executor(main(m)) for m in argvs]
    for f in asyncio.as_completed(fts, loop=loop):
        await f

async def main(argv):
    set_argv(argv)
    # running code. Loop button click, enter text, submit.

loop = asyncio.get_event_loop()
    loop.run_until_complete(async_set())
    loop.close()

И ошибка:

 fts = [loop.run_in_executor(main(m)) for m in argvs]
TypeError: run_in_executor() missing 1 required positional argument: 'func'

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

После изменения fts как показано ниже

fts = [loop.run_in_executor(None, main, m) for m in argvs]

Произошла ошибка, но только 1 процесс работает нормально

Traceback (most recent call last):
  File "C:/Users/admin/Desktop/test/Version/test.py", line 593, in <module>
    loop.run_until_complete(async_set())
  File "C:\Python\Python37\lib\asyncio\base_events.py", line 584, in run_until_complete
    return future.result()
  File "C:/Users/admin/Desktop/test/Version/test.py", line 60, in async_set
    await f
  File "C:\Python\Python37\lib\asyncio\tasks.py", line 533, in _wait_for_one
    return f.result()  # May raise f.exception().
  File "C:\Python\Python37\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "C:/Users/admin/Desktop/test/Version/test.py", line 67, in main
    set_login(ID, PW)
  File "C:/Users/admin/Desktop/test/Version/test.py", line 188, in set_login
    driver.find_element_by_xpath('//*[@id = "header"]/div/div[1]/ul[2]/li[1]/a').click()
  File "C:\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=73.0.3683.86)
  (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64)

сигнатура вызова для этого метода — это (executor, func, *args).

wwii 07.04.2019 17:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
699
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, насколько хорошо это имитирует ваш процесс, но это работает:

import asyncio
import concurrent.futures

def main(argv):
    t = random.choice([.02,.1,.5,.3,1.0,2.0,3.0,5.,6.,7.,8.,9.])
    time.sleep(t)
    return (t, argv * 2)

async def async_set():
    loop = asyncio.get_event_loop()
##    coroutines = []
    argvs = ["D", "E", "F", "G", "H", "I", "J", "K", "L"]
    with concurrent.futures.ProcessPoolExecutor() as pool:
        stuff = [loop.run_in_executor(pool,main,arg) for arg in argvs]
        for fut in asyncio.as_completed(stuff):
            print(await fut)

if __name__ == '__main__':

    loop = asyncio.get_event_loop()
    loop.run_until_complete(async_set())
    loop.close()

>>>
(0.5, 'EE')
(0.5, 'DD')
(0.5, 'FF')
(7.0, 'HH')
(8.0, 'II')
(0.1, 'LL')
(9.0, 'GG')
(9.0, 'JJ')
(7.0, 'KK')
>>> 

Это работает. Но использование ЦП по-прежнему составляет 100%.... Существенного улучшения нет..

user11211747 07.04.2019 19:26

Другие вопросы по теме