Выделение нескольких потоков в python для инструмента командной строки - PullRequest
0 голосов
/ 20 апреля 2020

Прежде всего, у меня очень ограниченные знания, когда дело доходит до этой темы c, но мне любопытно, возможно ли это вообще. У меня есть несколько больших выборок данных, которые должны быть обработаны с помощью инструмента командной строки в Linux. Я могу использовать около 14 потоков, но инструмент использует не все темы. Мне интересно, возможно ли разделить 14 потоков на две «группы», а затем параллельно запустить один и тот же инструмент для разных выборок данных, каждая из которых состоит из 7 потоков. Я читал о многопроцессорности, но из того, что я понимаю, я мог использовать только 1 поток для инструмента (извините, если я ошибаюсь, это из того, что я понимаю).

Итак, мой вопрос:

  1. Можно ли создать несколько групп потоков
  2. Пусть инструмент командной строки запускается параллельно с использованием этих групп

Например:

def function_to_run_tool(data_sample):
    cmd = 'command to run command line tool one one of the samples'

function_to_run_tool(sample) # This function runs in parallel on 7 threads per sample

В принципе, было бы здорово иметь несколько рабочих с более чем 1 потоком.

1 Ответ

0 голосов
/ 20 апреля 2020

Вы не можете запустить одну программу в большем количестве потоков, если эта программа не разделяется на потоки. Это как если бы вы хотели, чтобы ваш процессор запускал созданную вами программу в большее количество потоков, не кодируя ее для этого: это невозможно. Решение этой проблемы состоит в том, чтобы либо разбить ваши данные, скажем, на 14 частей, и иметь один поток для каждой из частей, или, если инструмент создан вами, вы можете изменить его так, чтобы он использовал больше потоков для каждого набора данных. ,

Чтобы добиться такого поведения, вы можете использовать модуль потоков следующим образом:

import threading

sample1 = your_first_sample
sample2 = your_second_sample

def function_to_run_tool(data_sample):
    cmd = 'command to run command line tool one one of the samples'

thread1 = threading.Thread(function_to_run_tool, [sample1, ])
thread2 = threading.Thread(function_to_run_tool, [sample2, ])
thread1.start()
thread2.start()
thread1.join()
thread2.join()

Примеры должны быть переданы в массивах в конструктор потоков, потому что он принимает весь массив как * аргументы для данная функция

...