Эта функция сравнивает два массива произвольной формы и 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;
}
Я предположил бы, что Вы могли сделать, это использование делает и делать-j xx команда.
, Возможно, make-файл как это
all : usera userb userc....
usera:
imapsync usera
userb:
imapsync userb
....
делают make-файл-j 10-f
Многопроцессорный модуль Python , казалось бы, соответствовал бы Вашей проблеме приятно. Это - высокоуровневый пакет, который поддерживает поточную обработку процессом.
Можно ли разработать то, под чем Вы подразумеваете в параллели ? Это кажется, что необходимо реализовать своего рода привязку очереди, таким образом, записи не выбраны дважды, и т.д. и команды, выполненные только однажды.
Большая часть системного обмана очереди - они просто пишут гигантский список ожидающих выполнения задач, затем выбирают, например, десять объектов, работают их и выбирают следующие десять объектов. Нет никакого распараллеливания.
, Если Вы предоставляете еще некоторую подробную информацию, я уверен, что мы можем выручить Вас.
GNU делает (и возможно другие реализации также) имеет-j аргумент, который управляет, сколько заданий это будет работать сразу. Когда задание завершается, составьте завещание, запускают другой.
Для этого вида задания записан PPSS: сценарий оболочки Параллельной обработки. Google для этого имени и Вы найдете его, я не буду linkspam.
На оболочке, 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
и так далее.
В 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, все же.)
Ну, если бы они в основном независимы друг от друга, я думал бы с точки зрения:
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
, команда в оболочке ожидает всех детей для завершения, а не некоторого ребенка для завершения.
Если Вы собираетесь использовать Python, я рекомендую использовать Скрученный для этого.
Конкретно Скрученный Бегун .
Параллель для этой цели сделана на заказ.
cat userlist | parallel imapsync
Одним из достоинств Parallel по сравнению с другими решениями является то, что он гарантирует, что выходные данные не будут смешиваться. Выполнение трассировки
в Parallel работает нормально, например:
(echo foss.org.my; echo www.debian.org; echo www.freenetproject.org) | parallel traceroute