我们如何用Java进行并行编程?有什么特殊的框架吗?我们如何使这些东西起作用?
我会告诉大家我需要什么,以为我开发了一个Web搜寻器,它可以从互联网上搜寻很多数据。一个爬网系统将无法正常工作,因此我需要更多的并行系统。如果是这种情况,我可以应用并行计算吗?你们能给我一个例子吗?
如果您询问纯 并行编程( 即 非并发 编程),那么绝对应该尝试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()方法的变体,接收方进程将接收到已发送的消息。发送方和接收方都指定一个标签,该标签用于在接收方找到匹配的传入消息。
在第12行上使用MPI.Init(args)方法初始化MPJ Express库之后,程序将获得其等级和MPI.COMM_WORLD通信器的大小。这两个进程都初始化了第18行上称为缓冲区的长度为10的整数数组。发送程序进程(等级为0)将值10存储在msg数组的第一个元素中。Send()方法的一种变体用于将msg数组的元素发送到接收器进程。
发送方进程在第27行调用Send()方法。前三个参数与要发送的数据有关。发送缓冲区(缓冲区数组)是第一个参数,后跟0(默认值)和1(计数)。发送的数据为MPI.INT类型,目标为1(对等变量);数据类型和目标被指定为Send()方法的第四和第五个参数。最后和第六个参数是标签变量。标签用于在接收方识别消息。消息标签通常是特定通信器中特定消息的标识符。另一方面,接收方进程(等级1)使用阻塞接收方法接收消息。