Параллельная обработка от очереди команды на Linux (удар, Python, рубин … безотносительно)

Эта функция сравнивает два массива произвольной формы и dimesionality:

function equals(a1, a2) {

    if (!Array.isArray(a1) || !Array.isArray(a2)) {
        throw new Error("Arguments to function equals(a1, a2) must be arrays.");
    }

    if (a1.length !== a2.length) {
        return false;
    }

    for (var i=0; i<a1.length; i++) {
        if (Array.isArray(a1[i]) && Array.isArray(a2[i])) {
            if (equals(a1[i], a2[i])) {
                continue;
            } else {
                return false;
            }
        } else {
            if (a1[i] !== a2[i]) {
                return false;
            }
        }
    }

    return true;
}
42
задан mlambie 21 January 2009 в 13:14
поделиться

10 ответов

Я предположил бы, что Вы могли сделать, это использование делает и делать-j xx команда.

, Возможно, make-файл как это

all : usera userb userc....

usera:
       imapsync usera
userb:
       imapsync userb
....

делают make-файл-j 10-f

38
ответ дан nlucaroni 4 August 2019 в 19:01
поделиться

Многопроцессорный модуль Python , казалось бы, соответствовал бы Вашей проблеме приятно. Это - высокоуровневый пакет, который поддерживает поточную обработку процессом.

1
ответ дан Jeff Bauer 4 August 2019 в 19:01
поделиться

Можно ли разработать то, под чем Вы подразумеваете в параллели ? Это кажется, что необходимо реализовать своего рода привязку очереди, таким образом, записи не выбраны дважды, и т.д. и команды, выполненные только однажды.

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

, Если Вы предоставляете еще некоторую подробную информацию, я уверен, что мы можем выручить Вас.

-3
ответ дан Till 4 August 2019 в 19:01
поделиться

GNU делает (и возможно другие реализации также) имеет-j аргумент, который управляет, сколько заданий это будет работать сразу. Когда задание завершается, составьте завещание, запускают другой.

7
ответ дан Ignacio Vazquez-Abrams 4 August 2019 в 19:01
поделиться

Для этого вида задания записан PPSS: сценарий оболочки Параллельной обработки. Google для этого имени и Вы найдете его, я не буду linkspam.

13
ответ дан Tim Cooper 4 August 2019 в 19:01
поделиться

На оболочке, xargs может использоваться для организации очередей параллельной обработки команды. Например, для того, чтобы всегда иметь 3 сна параллельно, спя в течение 1 секунды каждый и выполнение 10 снов всего делают

echo {1..10} | xargs -d ' ' -n1 -P3 sh -c 'sleep 1s' _

, И это спало бы в течение 4 секунд всего. Если Вы имеете список имен и хотите передать имена к выполняемым командам, снова выполнение 3 команд параллельно, чтобы сделать

cat names | xargs -n1 -P3 process_name

выполнило бы команду process_name alice, process_name bob и так далее.

44
ответ дан Johannes Schaub - litb 4 August 2019 в 19:01
поделиться

В Python Вы могли попробовать:

import Queue, os, threading

# synchronised queue
queue = Queue.Queue(0)    # 0 means no maximum size

# do stuff to initialise queue with strings
# representing os commands
queue.put('sleep 10')
queue.put('echo Sleeping..')
# etc
# or use python to generate commands, e.g.
# for username in ['joe', 'bob', 'fred']:
#    queue.put('imapsync %s' % username)

def go():
  while True:
    try:
      # False here means no blocking: raise exception if queue empty
      command = queue.get(False)
      # Run command.  python also has subprocess module which is more
      # featureful but I am not very familiar with it.
      # os.system is easy :-)
      os.system(command)
    except Queue.Empty:
      return

for i in range(10):   # change this to run more/fewer threads
  threading.Thread(target=go).start()

Непротестированный...

(конечно, сам Python является однопоточным. Необходимо все еще извлечь пользу из нескольких потоков с точки зрения ожидания IO, все же.)

3
ответ дан John Fouhy 4 August 2019 в 19:01
поделиться

Ну, если бы они в основном независимы друг от друга, я думал бы с точки зрения:

Initialize an array of jobs pending (queue, ...) - 200 entries
Initialize an array of jobs running - empty

while (jobs still pending and queue of jobs running still has space)
    take a job off the pending queue
    launch it in background
    if (queue of jobs running is full)
        wait for a job to finish
        remove from jobs running queue
while (queue of jobs is not empty)
    wait for job to finish
    remove from jobs running queue

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

я вижу, как сделать это в C довольно легко - это не было бы все это трудно в Perl, ни один (и поэтому не слишком трудно в других языках сценариев - Python, Ruby, Tcl, и т.д.). Я нисколько не уверен, что хотел бы сделать это в оболочке - эти wait, команда в оболочке ожидает всех детей для завершения, а не некоторого ребенка для завершения.

4
ответ дан Jonathan Leffler 4 August 2019 в 19:01
поделиться

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

Конкретно Скрученный Бегун .

3
ответ дан fragilewindows 4 August 2019 в 19:01
поделиться

Параллель для этой цели сделана на заказ.

cat userlist | parallel imapsync

Одним из достоинств Parallel по сравнению с другими решениями является то, что он гарантирует, что выходные данные не будут смешиваться. Выполнение трассировки в Parallel работает нормально, например:

(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute
26
ответ дан 26 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: