服务器就是为了响应每一个客户端请求,根据不能命令,返回不同的内容,并且每一个工作流独立,不会因为其中一个客户端请求而阻塞了其它客户端,服务器应对的办法无外乎 多线程 和多协程(多进程现在已经很少才用了 ,因为创建进程资源消耗太大),我们先来看看golang的多协程并发。
代码(golang):
package main
import (
"fmt"
"math/rand"
)
var codeArray =[4]string{"首页","西瓜视频","小视频","我的"} //申明一个全局变量 模型为:今日头发App低部导航栏请求code
func main() {
for i:=0;i<100 ;i++ {
cadeArrayIndex:=rand.Intn(len(codeArray)); //模拟错综复杂前端请求命令,随机获得code一个指针
go workerChannel(cadeArrayIndex); //创建一个协程
}
}
func workerChannel(codeArrayIndex int) (workerState bool,err string) { //根据不同命令,服务器返回响应信息
if(codeArrayIndex==0){
fmt.Println("收到一个'首页'命令请求,返回:hello,world!")
workerState=true;
}else if codeArrayIndex==1{
fmt.Println("收到一个'西瓜视频'命令请求,返回:西瓜在此")
workerState=true;
}else if codeArrayIndex==2{
fmt.Println("收到一个'小视频'命令请求,返回:小视频还在拍摄中")
workerState=true;
}else if codeArrayIndex==3{
fmt.Println("收到一个'我的'命令请求,返回:程序桃子")
workerState=true;
}else {
workerState=false;
err="未能失败命令"
}
return workerState,err
}
代码说明:golang语言可以同时返回多个值, java 可以通过返回数组或对象,达到同样的效果。
服务器在同时相应前端请求时候,需要对一些资源进行锁定,防止出现错误。比如,服务器分苹果案例,一个只有10个苹果,一个客户端领取一个就减少一个,当苹果发完之后,服务器在接到前端请求就返回错误。
代码(java):
public class testThreadWorker {
public volatile static Integer sum=5; //苹果数量
public volatile static ReentrantLock lock eObject=new ReentrantLock();
public static void main(String args[]) {
ArrayList<Thread> ThreadArray = new ArrayList<Thread>(); //用于存放 线程 对象
for (int i = 0; i < 10; i++) {
Thread clientWorker1 = new TestWorkerClientThread_1(i); //创建一个线程
ThreadArray.add(clientWorker1);
}
for (Thread oneWorker : ThreadArray) {
oneWorker.start(); //启动线程
}
}
}
class TestWorkerClientThread_1 extends Thread{
private int unid;
public TestWorkerClientThread_1(int unid){
this.unid=unid;
}
public void run() {
//第一中方法:采用 synchronized 来锁定
synchronized (testThreadWorker.sum) { //对象进行锁定
System.out.println("获得对象锁");
if(testThreadWorker.sum>0){
testThreadWorker.sum--; //减少一个苹果
System.out.println("线程["+this.unid+"]:享获得一个苹果");
}else {
System.out.println("线程["+this.unid+"]:遗憾,苹果没有了");
}
}
//对象锁另外一种方法,通过使用ReentrantLock类来实现
/*
testThreadWorker.lockeObject.lock();
System.out.println("获得对象锁");
try {
if (testThreadWorker.sum > 0) {
testThreadWorker.sum--; //减少一个苹果
System.out.println("线程[" + this.unid + "]:享获得一个苹果");
} else {
System.out.println("线程[" + this.unid + "]:遗憾,苹果没有了");
}
}finally {
testThreadWorker.lockeObject.unlock();
}
*/ }
}
这里采用java多线程处理,在线程中采用两种对象锁的方法来实现来保证数据安全性,至于用哪种方式因人而异,习惯就好。总之,服务器编号过程中,时时保持高度警惕:保持数据正确性和并发力。
感谢java和golang。