Подтвердить что ты не робот

Параллельное программирование на Java

Как мы можем выполнять параллельное программирование на Java? Есть ли какие-то специальные рамки для этого? Как мы можем заставить материал работать?

Я расскажу вам, ребята, что мне нужно, подумайте, что я разработал веб-гусеничный манипулятор, его обходную часть веб-сайта из Интернета, одна система сканирования не заставит все работать правильно, поэтому нам нужно 1000 системы для работы, если это так, я могу применить параллельные вычисления? Можете ли вы, ребята, дать мне правильный пример?

4b9b3361

Ответ 1

Если вы спрашиваете о чистом параллельном программировании, то есть не параллельном программировании, тогда вам обязательно нужно попробовать MPJExpress http://mpj-express.org/. Это поточно-безопасная реализация mpiJava и поддерживает как распределенные, так и разделяемые модели памяти. Я пробовал его и нашел очень надежным.

1 import mpi.*;  
2  
3 
/**  
4  * Compile:impl specific.  
5  * Execute:impl specific.  
6  */  
7  
8 public class Send {  
9 
10     public static void main(String[] args) throws Exception { 
11 
12         MPI.Init(args); 
13 
14         int rank = MPI.COMM_WORLD.Rank() ; //The current process.
15         int size = MPI.COMM_WORLD.Size() ; //Total number of processes
16         int peer ; 
17 
18         int buffer [] = new int[10]; 
19         int len = 1 ;
20         int dataToBeSent = 99 ; 
21         int tag = 100 ; 
22 
23         if(rank == 0) { 
24 
25             buffer[0] = dataToBeSent ; 
26             peer = 1 ; 
27             MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ; 
28             System.out.println("process <"+rank+"> sent a msg to "+ 29                                "process <"+peer+">") ; 
30 
31         } else if(rank == 1) { 
32 
33             peer = 0 ; 
34             Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35                                                 MPI.INT, peer, tag); 
36             System.out.println("process <"+rank+"> recv'ed a msg\n"+ 37                                "\tdata   <"+buffer[0]    +"> \n"+ 38                                "\tsource <"+status.source+"> \n"+ 39                                "\ttag    <"+status.tag   +"> \n"+ 40                                "\tcount  <"+status.count +">") ; 
41 
42         } 
43 
44         MPI.Finalize(); 
45 
46     }  
47 
48 }

Одной из наиболее распространенных функций, предоставляемых библиотеками обмена сообщениями, такими как MPJ Express, является поддержка двухточечной связи между исполняемыми процессами. В этом контексте два процесса, принадлежащие одному и тому же коммуникатору (например, MPI.COMM_WORLD-коммуникатор), могут связываться друг с другом путем отправки и получения сообщений. Вариант метода Send() используется для отправки сообщения из процесса отправителя. С другой стороны, отправленное сообщение принимается процессом приемника с использованием варианта метода Recv(). Оба отправителя и получателя указывают тег, который используется для поиска соответствующих входящих сообщений со стороны приемника.

После инициализации библиотеки MPJ Express с использованием метода MPI.Init(args) в строке 12 программа получает свой ранг и размер коммуникатора MPI.COMM_WORLD. Оба процесса инициализируют целочисленный массив длиной 10, называемый буфером в строке 18. Отправитель-ранг 0 - сохраняет значение 10 в первом элементе массива msg. Вариант метода Send() используется для отправки элемента массива msg в процесс приемника.

Процесс отправителя вызывает метод Send() в строке 27. Первые три аргумента связаны с отправляемыми данными. Передача bu! Er - массив bu! Er - это первый аргумент, за которым следуют 0 (o! Set) и 1 (count). Передаваемые данные имеют тип MPI.INT, а пункт назначения - 1 (одноранговая переменная); тип данных и назначение указываются как четвертый и пятый аргументы методу Send(). Последний и шестой аргумент - это переменная тега. Тег используется для идентификации сообщений со стороны приемника. Тег сообщения обычно является идентификатором конкретного сообщения в конкретном коммуникаторе. С другой стороны, процесс приемника (ранг 1) принимает сообщение с использованием метода приема блокировки.

Ответ 2

Java поддерживает потоки, поэтому вы можете иметь многопоточное Java-приложение. Я настоятельно рекомендую книгу Concurrent Programming in Java: Design Principles and Patterns:

http://java.sun.com/docs/books/cp/

Ответ 3

Вы хотите посмотреть на платформу параллельной обработки Java (JPPF)

Ответ 4

Вы можете посмотреть Hadoop и Hadoop Wiki. Это фреймворк apache, основанный на google map-reduce.It позволяет выполнять распределенные вычисления с использованием нескольких систем. Многие компании, такие как Yahoo, Twitter, используют его (Сайты, созданные Hadoop).Проверьте эту книгу для получения дополнительной информации о том, как ее использовать Hadoop Book.

Ответ 5

Это ресурс параллельного программирования, на который я указывал в прошлом:

http://www.jppf.org/

Я понятия не имею, хорошо ли это или нет, просто кто-то рекомендовал это некоторое время назад.

Ответ 6

В java параллельная обработка выполняется с использованием потоков, которые являются частью библиотеки времени выполнения

Concurrency Tutorial должен ответить на множество вопросов по этой теме, если вы новичок в Java и параллельном программировании.

Ответ 7

Я слышал об одном на конференции несколько лет назад - ParJava. Но я не уверен в текущем статусе проекта.

Ответ 8

Насколько я знаю, в большинстве операционных систем механизм Threading Java должен основываться на реальных потоках ядра. Это хорошо от перспектив параллельного программирования. Другие языки, такие как Python, просто выполняют некоторое мультиплексирование процессора (а именно, если вы запускаете многопоточное приложение на многопроцессорном компьютере, вы увидите только один процессор).

Вы можете легко найти что-то, просто перетаскивая его: например, это первый результат для "java threading": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/

В основном это сводится к расширению класса Thread, перегружает метод "run" кодом, принадлежащим другому потоку, и вызывает метод "start" в экземпляре расширенного вами класса.

Также, если вам нужно сделать что-то потокобезопасное, посмотрите на синхронизированные методы.

Ответ 9

пакет java.util.concurrency и книга Брайана Гёца "Java concurrency на практике"

Здесь также много ресурсов о параллельных шаблонах Ральфа Джонсона (одного из авторов шаблона дизайна GoF): http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

Ответ 10

Является ли Ateji PX параллельным циклом, что вы ищете? Это будет сканировать все сайты параллельно (обратите внимание на двойную строку рядом с ключевым словом for):

for||(Site site : sites) {
  crawl(site);
}

Если вам нужно составить результаты обхода, то вы, вероятно, захотите использовать параллельное понимание, например:

Set result = set for||{ crawl(site) | Site site : sites }

Далее читайте здесь: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

Ответ 12

Возможно, вы захотите проверить Hadoop. Он предназначен для работы на произвольном количестве ящиков и заботится обо всех бухгалтериях для вас. Он вдохновлен Google MapReduce и связанными с ним инструментами, поэтому он даже поступает из веб-индексирования.

Ответ 14

вы можете использовать JCSP (http://www.cs.kent.ac.uk/projects/ofa/jcsp/), библиотека реализует принципы CSP (Communicating Sequential Processes) в Java, параллелизация абстрагируется от уровня потока и вы имеете дело с процессами.

Ответ 15

Java SE 5 и 6 представили набор пакетов в java.util.concurrent. *, которые предоставляют мощные строительные блоки concurrency. проверьте это для получения дополнительной информации. http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

Ответ 16

Вы можете попробовать Parallel Java 2 Library.

На сайте проф. Алан Камински написал:

Ускорьтесь до 2013 года, когда я начал разрабатывать PJ2. Параллельные вычисления расширились далеко за рамки того, что было десять лет назад. Многоярусные параллельные компьютеры были оснащены гораздо большим количеством процессорных ядер и гораздо большей основной памятью, так что вычисления, которые раньше требовали целого кластера, теперь можно было выполнить на одном многоядерном node. Новые виды параллельного вычислительного оборудования стали обычным явлением, в частности ускорителями графического процессора (GPU). Службы облачных вычислений, такие как Amazon EC2, позволяли запускать параллельные программы на виртуальном суперкомпьютере с тысячами ядер. Открылись новые области приложений для параллельных вычислений, в частности большая аналитика данных. Появились новые API параллельного программирования, такие как OpenCL и NVIDIA Corporation CUDA для параллельного программирования графических процессоров, а также каркасные структуры, такие как Apache Hadoop для больших вычислений данных. Чтобы изучить и использовать все эти тенденции, я решил, что необходима совершенно новая библиотека Parallel Java 2.

В начале 2013 года, когда PJ2 еще не был доступен (хотя раньше была версия), я попробовал Java Parallel Processing Framework (JPPF). JPPF был в порядке, но на первый взгляд PJ2 выглядит интересным.

Ответ 17

Существует библиотека под названием Habanero-Java (HJ), разработанная в Университете Райса, которая была построена с использованием лямбда-выражения и может запускаться на любой Java JVM.

HJ-lib объединяет широкий спектр конструкций параллельного программирования (например, асинхронные задачи, фьючерсы, задачи, управляемые данными, все, барьеры, фазеры, транзакции, участники) в единой модели программирования, которая позволяет уникальные комбинации этих конструкций ( например, вложенные комбинации задач и актера parallelism).

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

Вот простой пример HelloWorld:

import static edu.rice.hj.Module1.*;

public class HelloWorld {

public static void main(final String[] args) {

    launchHabaneroApp(() -> {

        finish(() -> {
            async(() -> System.out.println("Hello World - 1!"));
            async(() -> System.out.println("Hello World - 2!"));
            async(() -> System.out.println("Hello World - 3!"));
            async(() -> System.out.println("Hello World - 4!"));
        });

    });
}}

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