Элегантно кодирую попробовать: кроме цепи - PullRequest
3 голосов
/ 09 января 2020

У меня есть в concurrent.futures, который обычно работает с chunksize = 1. Тем не менее, иногда я получаю большой набор данных, который требует большего размера. В настоящее время я решил эту проблему с помощью следующего кода:

for i in datasets:
    try:
        with concurrent.futures.ProcessPoolExecutor() as executor:
            results=tuple(executor.map(do_something, parameters, chunksize=1)
    except concurrent.futures.process.BrokenProcessPool:
        try:
            with concurrent.futures.ProcessPoolExecutor() as executor:
                results=tuple(executor.map(do_something, parameters, chunksize=2)
        except concurrent.futures.process.BrokenProcessPool:
            try:
                with concurrent.futures.ProcessPoolExecutor() as executor:
                    results=tuple(executor.map(do_something, parameters, chunksize=4)
            etc. etc. etc....
            except concurrent.futures.process.BrokenProcessPool:
                   print('code failed')

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

Ответы [ 2 ]

3 голосов
/ 09 января 2020

Вы можете использовать for l oop для итерации по размерам чанков, break l oop в случае успеха или ввести блок else для вывода сообщения об ошибке:

for i in datasets:
    for chunksize in 1, 2, 4:
        try:
            with concurrent.futures.ProcessPoolExecutor() as executor:
                results=tuple(executor.map(do_something, parameters, chunksize=chunksize)
            break
        except concurrent.futures.process.BrokenProcessPool:
            pass
    else:
        print('code failed')
0 голосов
/ 09 января 2020

Вы должны использовать другой l oop, чтобы выполнить sh это. Код, который вы выполняете, каждый раз один и тот же с разным размером чанка. Вот пример использования for l oop

for i in datasets:

    for chunksize in [1,2,4]:
      try:
          with concurrent.futures.ProcessPoolExecutor() as executor:
              results=tuple(executor.map(do_something, parameters, chunksize=chunksize)
          break
      except concurrent.futures.process.BrokenProcessPool:
          if chunksize == 4:
            raise SomeErrorForMaxRetries
          else:
            continue
...