前言

前面一篇文章全部用的是阻塞API,也就是同步Socket程序,客户端一卡一顿、服务端只能一次处理一个客户端的消息,不具有实用性。
所有有了异步和多路复用两种技术解决了阻塞问题。

2.1什么是异步代码

不需要进程一直等待下去,而是继续往下执行,直到满足条件才调用回调函数,这样可以提高执行的效率。
异步的实现依赖于多线程技术。在Unity中,执行Start、Update方法的线程是主线程,会另外开一条线程执行异步代码,然后满足条件后另一条线程调用回调函数,主线程继续往下执行代码,不受影响。

2.2异步客户端

2.2.1异步Connect

每一个同步API对应两个异步API,分别是在原名称前加上Begin和End。
如果使用Connect且服务端没有答复,那么用户在尝试连接这段时间内不能做任何操作,体验极差。
这里就介绍一个BeginConnect的函数原型,后面出现的异步API都大同小异

public IAsyncResult BeginConnect(string host,//远程主机IPint port,//远程主机端口号AsyncCallback requestCallback,//回调函数形式:void ConnectCallback(IAsyncResult ar)object state//一般用自定义的客户端类来传进去,一般包含链接操作的相关信息,会被传递给callback
)

IAsyncResult是.NET提供的一步操作,通过begin…和end…完成原同步方法的异步调用。begin…包含回调委托和用户定义的状态对象,返回一个实现IAsyncResult接口的对象。end…用于结束一步操作返回结果,返回值和同步方法相同。

2.2.2异步客户端代码

里面的代码有点乱,因为我是把一整章的代码打完才写文章的。

//点击连接按钮public void Connection(){//新建sockect//地址族IPV4,套接字类型stream,协议类型socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//connect//远程IP地址,远程端口,阻塞方法,卡住直到服务端回应、//自己建立服务器的话,ip地址和端口号就是这两个//socket.Connect("127.0.0.1", 8888);//异步socket.BeginConnect("127.0.0.1", 8888, ConnectCallback, socket);}//Connect回调public void ConnectCallback(IAsyncResult ar){try{//此socket可由ar.AsyncState获取到Socket socket = (Socket)ar.AsyncState;socket.EndConnect(ar);Debug.Log("Socket Connect Succ");//接收缓冲区、0表示从readBuff第0位开始接收数据(和TCP粘包问题有关)、每次最多接收1024字节数据(即使服务器发送1025,也只接收1024)//接收函数调用时机:在连接成功后就开始接受数据,接收到数据后,回调函数ReceiveCallback被调用socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);}catch (SocketException ex){Debug.Log("Socket Connect fail" + ex.ToString());}}//Receive回调public void ReceiveCallback(IAsyncResult ar){try{Socket socket = (Socket)ar.AsyncState;int count = socket.EndReceive(ar);string s = System.Text.Encoding.Default.GetString(readBuff, 0, count);recvStr = s + "\n" + recvStr;//接收完一串数据后,等待下一串数据的到来socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);}catch (SocketException ex){Debug.Log("Socket Receive fail" + ex.ToString());}}//点击发送按钮public void Send(){//sendif (canSend){string sendStr = InputField.text;//string sendStr = System.DateTime.Now.ToString();//将str转化为字节流byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);//socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallback, socket);socket.Send(sendBytes);}//异步不需要receive//Recv//byte[] readBuff = new byte[1024];接收数据的长度//int count = socket.Receive(readBuff);//string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);//text.text = recvStr;Close//socket.Close();}//Send回调public void SendCallback(IAsyncResult ar){try{//这个socket是传进回调的用户定义对象,可强转为socketSocket socket = (Socket)ar.AsyncState;int count = socket.EndSend(ar);Debug.Log("Socket Send succ" + count);}catch(SocketException ex){Debug.Log("Socket Send fail" + ex.ToString());}}

大致讲几个重点部分:

  • Connect会等待服务端应答导致卡顿、Receive会等到收到服务端数据卡顿、send会等到接收方确认收到消息而卡顿,我们把这些都换成了异步方法。
  • BeginReceive的调用位置分别在ConnectCallback,在连接成功后就开始接收数据,收到数据后,回调函数ReceiveCallback被调用。另一个就是在BeginReceive内部,接收完一串数据后,等待下一串数据的到来。
  • 在Unity中只有主线程可以操控UI组件,所以在其他线程执行的异步回调不能直接给text赋值,只能给一个全局变量赋值然后再给text赋值
  • Send有发送缓冲区,如果满了(也就是服务端不接收且一直发送的情况),就会卡住。而且send只是把数据写入到缓冲区,返回只代表成功将数据发送到缓存区,对方可能没有收到数据

2.3异步服务端

同步服务端同一时间只能处理一个客户端的请求,用异步方法就可以同时处理多个。

2.3.1管理客户端

因为服务端需要转发某个客户端发送来的消息给所有客户端,所以要有列表平保存所有连接到该服务端的客户端。
这个socket是服务端用于回应这个客户端的socket对象,并不是客户端用于连接的socket。
readBuff是填充BeginReceive参数的读缓冲区

class ClientState{public Socket socket;public byte[] readBuff = new byte[1024];}

再用方便获取客户端信息

static Dictionary<Socket, ClientState> clients = new Dictionary<Socket, ClientState>();

2.3.2服务端代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;namespace ConsoleApp1
{class ClientState{public Socket socket;public byte[] readBuff = new byte[1024];}class MainClass{//异步服务器//监听Socketstatic Socket listenfd;//客户端Socket及状态信息static Dictionary<Socket, ClientState> clients = new Dictionary<Socket, ClientState>();public static void Main(string[] args){Console.WriteLine("Hello");//SocketSocket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//BindIPAddress ipAdr = IPAddress.Parse("127.0.0.1");//IP地址IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);//IP和端口//给listenfd套接字绑定IP和端口,"127.0.0.1"地址和8888号端口listenfd.Bind(ipEp);//Listen,等待客户端连接//0表示容纳等待接收的客户端连接数不受限制,1代表最多可容纳等待接受的连接数为1listenfd.Listen(0);Console.WriteLine("[服务器]启动成功");//异步服务器listenfd.BeginAccept(AcceptCallback, listenfd);//等待Console.ReadLine();}
//Accept回调//是beginaccept的回调函数,处理3件事//1.给新的连接分配ClientState,并把它加入到clients列表中//2.异步接收客户端数据//3.再次调用BeginAccept循环public static void AcceptCallback(IAsyncResult ar){try{Console.WriteLine("[服务器]Accept");//监听和应答客户端的socketSocket listenfd = (Socket)ar.AsyncState;//处理该客户端的socketSocket clientfd = listenfd.EndAccept(ar);//clients列表ClientState state = new ClientState();//初始化此客户端类,key和value岂不是重复利用了?state.socket = clientfd;clients.Add(clientfd, state);//接收数据BeginReceive,以ClientState取代Socketclientfd.BeginReceive(state.readBuff, 0, 1024, 0, ReceiveCallback, state);//继续Acceptlistenfd.BeginAccept(AcceptCallback, listenfd);}catch(SocketException ex){Console.WriteLine("Socket Accept fail" + ex.ToString());}}//Receive回调//1.服务端收到消息后,回应客户端//2.如果收到客户端关闭连接的信号"if(count==0)",断开连接//3.继续调用BeginReceive接收下一个数据public static void ReceiveCallback(IAsyncResult ar){try{//发送消息的客户端ClientState state = (ClientState)ar.AsyncState;Socket clientfd = state.socket;//当receive返回值小于等于0时,表示socket连接可以断开int count = clientfd.EndReceive(ar);//客户端关闭if(count == 0){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Socket Close");return;}//从收到的字节流转为stringstring recvStr = System.Text.Encoding.Default.GetString(state.readBuff, 0, count);string sendStr = clientfd.RemoteEndPoint.ToString() + ":" + recvStr;byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);//string转为bytes//用于处理该客户端数据的socketforeach(ClientState s in clients.Values){s.socket.Send(sendBytes);}clientfd.BeginReceive(state.readBuff, 0, 1024, 0, ReceiveCallback, state);}catch(SocketException ex){Console.WriteLine("Socket Receive fail" + ex.ToString());}}}

重点:

  • 将Accept和Receive变为异步。否则Accept会一直阻塞在该语句上,用了异步后,等客户端连接上来回调函数就会被执行。可用EndAccept获取新客户端的socket。
  • 异步服务器结构:Socket、Bind、Listen初始化后监听socket,用BeginAccept异步处理客户端连接,如有连接就调用AcceptCallback回调,让客户端开始接受数据。再急需调用BeginAccept等待下一个连接
  • 当Receive返回值小于等于0时,表示连接断开,可以关闭Socket。

2.5状态监测Poll

在阻塞方法前面加上一层判断,有数据可读时调用Receive,有数据写调用Send,这就是Poll。
Socket类的Poll方法:

public bool Poll(int microSeconds,SelectMode mode
)

第一个参数是等待回应的时间,以ms为单位,如果为-1就一直等待,如果为0表示非阻塞(不希望阻塞就写0)。
mode有三种可选模式,不细嗦了

2.5.1Poll客户端

卡住客户端最大的问题就是阻塞Receive,只要在Update里不停判断有没有数据可读,有数据可读才调用Receive就行了
一般客户端的poll设为不阻塞模式

public void Update(){if(socket == null){return;}//poll客户端if (socket.Poll(0, SelectMode.SelectRead)){byte[] readBuff = new byte[1024];int count = socket.Receive(readBuff);//不阻塞模式,microSeconds=0string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);text.text = recvStr;}//处理阻塞send应该也差不多if (socket.Poll(0, SelectMode.SelectWrite)){canSend = true;}else{canSend = false;}}

比异步的套娃简洁,该干嘛时干嘛即可。

2.5.3Poll服务端

注意点:

  • 不断检测 监听Socket(llistenfd)和各个客户端Socket的状态,如果监听Socket可读意味有客户端连接,就Aceept回应,并将其加入列表。客户端socket可读,就转发它的消息给所有客户端
  • while循环最后有一个sleep让程序挂起1ms,避免死循环。
  • 如果收到长度为0的数据就直接break循环,因为为0就会将这个客户端踢出列表,再遍历它会出错。
  • Poll超时时间设为0,可以及时处理多个客户端连接,但是导致CPU占用率高
  • 最后两个Read函数和对应的回调做的事差不多,都是条件达到了就调用
		public static void Main(string[] args){Console.WriteLine("Hello");//SocketSocket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//BindIPAddress ipAdr = IPAddress.Parse("127.0.0.1");//IP地址IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);//IP和端口//给listenfd套接字绑定IP和端口,"127.0.0.1"地址和8888号端口listenfd.Bind(ipEp);//Listen,等待客户端连接//0表示容纳等待接收的客户端连接数不受限制,1代表最多可容纳等待接受的连接数为1listenfd.Listen(0);Console.WriteLine("[服务器]启动成功");while (true){//检查listenfd,可读就添加客户端信息if (listenfd.Poll(0, SelectMode.SelectRead)){ReadListenfd(listenfd);}//检查clientfdforeach (ClientState s in clients.Values){Socket clientfd = s.socket;if (clientfd.Poll(0, SelectMode.SelectRead)){//false表示客户端断开(收到长度为0的数据)//断开会删掉列表中对应的信息,导致遍历失败,所以直接breakif (!ReadClientfd(clientfd)){break;}}}//防止CPU占用过高//让程序挂起1ms,避免死循环让CPU喘息System.Threading.Thread.Sleep(1);}}public static void ReadListenfd(Socket listenfd){Console.WriteLine("Accept");Socket clientfd = listenfd.Accept();ClientState state = new ClientState();state.socket = clientfd;clients.Add(clientfd, state);}//和异步服务端的Receivecallback类似,用于接收客户端消息,并广播给所有客户端public static bool ReadClientfd(Socket clientfd){ClientState state = clients[clientfd];//接收int count = 0;try{count = clientfd.Receive(state.readBuff);}catch(SocketException ex){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Receive SocketException" + ex.ToString());return false;}//让客户端关闭if(count == 0){clientfd.Close();clients.Remove(clientfd);Console.WriteLine("Socket Close");return false;}//广播string recvStr = System.Text.Encoding.Default.GetString(state.readBuff, 0, count);Console.WriteLine("Receive" + recvStr);//发送回去的是ip+收到的string sendStr = clientfd.RemoteEndPoint.ToString() + ":" + recvStr;byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);foreach (ClientState cs in clients.Values){cs.socket.Send(sendBytes);}return true;}

2.6多路复用Select

2.6.1什么是多路复用

虽然Poll逻辑清晰,但是弊端也很明显,比如服务端没有收到客户端数据也一直循环,浪费Cpu。
所以有了多路复用,也就是同时处理多路信号,比如同时检测多个Socket的状态。
办法就是:在需要坚挺的Socket列表中,如果有一个(or多个)Socket可读(or可写or错误),就返回这些Scoket加入对应的列表。

Public static void Select(IList checkRead,IList checkWrite,IList checkError,int microSeconds
)

将需要检测的socket加入对应列表后,作为这函数的参数被调用就会改变原列表,只会留下符合要求的。当没有符合要求的socket就会阻塞。

2.6.2Select服务端

仍然使用while(true){…}结构,不断调用Select检测Socket状态。如果不为空就调用对应的函数,类似回调,处理对应的socket。

			//select服务器//checkReadList<Socket> checkRead = new List<Socket>();//主循环while (true){//填充checkRead列表checkRead.Clear();checkRead.Add(listenfd);foreach (ClientState s in clients.Values){checkRead.Add(s.socket);}//select,只将待检查可读的列表传进去Socket.Select(checkRead, null, null, 1000);//调用完上面的方法后这个列表就被改了,这个列表中只有可读的socketforeach (Socket s in checkRead){//因为listnfd本身就被加进去了if (s == listenfd){ReadListenfd(s);}//除了listen其余都是可读的客户端,直接处理即可else{ReadClientfd(s);}}}

2.6.3Select客户端

代码在update中,和poll客户端极其相似,而且只需要检查一个socket。
**问题在于,如果没有可读的,是会卡住update线程吗??**可能它本身就是开启一个异步线程来检测,卡住的是异步线程

		checkRead.Clear();checkRead.Add(socket);//selectSocket.Select(checkRead, null, null, 0);//checkforeach (Socket s in checkRead){byte[] readBuff = new byte[1024];int count = socket.Receive(readBuff);string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);text.text = recvStr;}

在Update监测数据性能太差,商业上一般使用异步或者用多线程模拟异步

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 算法基础课第二章KMP

    KMP算法用于进行字符串匹配。 暴力的方法是每次失配就从模式串的头部进行匹配&#xff0c;但是因为有前后缀匹配的情况&#xff0c;不必每次回到头部&#xff0c;通过一个next数组, 可以在失配时让主串i去匹配next[j],这样能很快的进行匹配。 如何使用next数组 void KMP(stri…...

    2024/4/28 3:45:22
  2. vscode安装odoo

    vscode可很好地支持odoo&#xff0c;配置步骤如下&#xff1a; 1、 2、此时 点击 ctrl shift p 打开命令面板 输入 Python: select interpreter&#xff0c; 先安装python,然后会出现 然后&#xff1a; 此处我们需要将configurations 中的内容替换 {// 使用 IntelliSen…...

    2024/4/17 15:45:48
  3. 解决Vue项目在iOS 10 报错 “Cannot declare a let variable twice: ‘r‘”

    问题描述 如下图所示&#xff0c;H5页面在iPhone7P及IPhone5c&#xff08;iOS 10&#xff09;手机上打开白屏&#xff0c;使用vconsole查看报错原因是Cannot declare a let variable twice: r 问题定位 原因是由于ios10的bug&#xff0c;按报错的描述来看原因是“变量不能被…...

    2024/4/15 15:39:33
  4. Python中用logging编写属于自己的日志系统

    一、日志集成&#xff0c;为什么要写日志&#xff1f; 在公司开发的任何一个系统都会有日志设计&#xff0c;通过日志&#xff0c;把系统的行为记录并保存起来&#xff0c;一旦系统发生了一些问题便可以通过日志去分析问题发生在哪里&#xff0c;是因为什么原因发生的。同样&a…...

    2024/4/15 15:39:23
  5. Jackson工具类

    Jackson封装工具类 package com.chen.utils;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature;import java.text.SimpleDateFormat;/*** jacks…...

    2024/4/26 3:30:21
  6. clickhouse如何解决GLIBC不兼容问题

    介绍 首先解释下为什么会有GLIBC不兼容问题&#xff1a;在clickhouse的编译环境中ubuntu版本是20, 而运行环境中是16&#xff0c;不同ubuntu版本支持的GLIBC版本不一样&#xff0c;因此将ubuntu20上编译出来的ck放在ubuntu16下运行时&#xff0c;便会出现兼容性问题。虽然ck编…...

    2024/4/15 15:39:33
  7. 【ZZULIOJ】 Python 1018: 奇数偶数

    题目描述 输入一个整数&#xff0c;判断该数是奇数还是偶数。 输入 输入整数n。 输出 如果该数是奇数就输出“odd”&#xff0c;偶数就输出“even”&#xff08;输出不含双引号&#xff09;。 样例输入 Copy -3 样例输出 Copy odd 本题考查了除法运算符&#xff0c;没…...

    2024/4/15 15:39:38
  8. “21天好习惯”第一期——9

    用C语言表示分段函数 #include "stdio.h" #include "math.h" int main(int argc,char *argv[]){double x,y;printf("Input x(R:)...\nx");scanf("%lf",&x);if(x<5)y-x3.5;else if(x>5 && x<10)y20-3.5*pow(x3,7)…...

    2024/4/15 15:39:38
  9. SNPE教程一:基本概念

    1、基本概念 SNPE是高通推出的一个神经网络加速引擎&#xff0c;他可以同时利用到DSP和GPU、GPU。 目前最新版本的SNPE1.54支持TensorFlow, Caffe, Caffe2, ONNX, TensorFlow, PyTorch 转换的流程大致如下&#xff1a; 将训练好的模型用SNPE的工具转成DLC文件就可以在SNPE运…...

    2024/4/18 6:27:01
  10. Flash型、SAR型与Σ-Δ型ADC比较之浅见

    电路中经常用到A/D转换器&#xff0c;但对于原理有没有想进一步了解下&#xff0c;以显示自己不止于小白呢&#xff0c;那么请往下看。 ----A/D转换器的分类---- 包括并联比较型&#xff08;也叫Flash型&#xff09;、SAR型&#xff08;逐次逼近型&#xff09;、Σ-Δ型等。 …...

    2024/4/20 0:06:23
  11. osx10.15.4系统下flutter开发环境的搭建

    osx10.15.4系统下flutter开发环境的搭建获取Flutter SDKAndroid开发环境搭建Android studio的安装android设备上运行ios开发环境搭建xcode的安装ios设备运行参考链接获取Flutter SDK 1.访问https://flutter.dev/docs/development/tools/sdk/releases?tabmacos#macos下载sdk 2…...

    2024/4/15 15:39:43
  12. 21互联网从业必读中文-C++ 模板(第二版)

    本书介绍 本书第一版大约出版于 15 年前。起初我们的目的是编写一本对 C工程师有帮 助的 C模板权威指南。目前该项目从以下几个方面来看是成功的&#xff1a;它的作用得 到了不少读者的认可&#xff0c; 也多次被推荐为参考书目&#xff0c; 并屡获好评。 第一版已经很老了&…...

    2024/4/17 22:21:43
  13. vuex使用例子

    1.新建两个component 1>Students.vue <template><div><div>student:</div><input v-model"student"/><button click"onAddStudent(student)">add</button><ul><li v-for"(student,index) in…...

    2024/4/20 5:44:10
  14. 学校管理系统逻辑关系

    ...

    2024/4/20 2:43:01
  15. 波场首个GameFi项目WIN NFT HORSE将与币安联合推出IGO

    曾直言“ALL IN”GameFi的孙宇晨带着WIN NFT HORSE进入大众视野。 10月31日&#xff0c;WIN NFT HORSE通过官方推特宣布&#xff0c;他们将联合币安 NFT 推出IGO&#xff0c;并同时上架主题盲盒。在接下来的3周里&#xff0c;将有一个密集的营销活动&#xff0c;以推动社群的壮…...

    2024/4/15 15:39:43
  16. 学习爬虫参考

    【爬虫教程】吐血整理&#xff0c;最详细的爬虫入门教程~ - AwesomeTang - 博客园 (cnblogs.com) (3条消息) 大数据之如何利用爬虫爬取数据做分析_litao0942051021的博客-CSDN博客_爬虫爬取数据 #!/usr/bin/python from typing import Counter import requests …...

    2024/4/15 15:39:43
  17. 浅谈Golang函数调用栈-传参和返回值

    函数调用栈-传参和返回值defer与return时机传值的swap函数传指针的swap函数匿名返回值函数具名返回值函数调用多个函数的小问题defer与return时机 return赋值和返回是两个步骤&#xff0c;不是原子操作&#xff0c;如果有defer会插在两个步骤中: 返回值赋值(return value)def…...

    2024/4/27 12:42:50
  18. open‘resty无法连接记录

    连接nginx成功&#xff0c;如192.168.211.132:8080&#xff0c;但连接openresty失败&#xff0c;如192.168.211.132&#xff0c;连接失败。 解决方式&#xff1a; /usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf 然后重启openresty …...

    2024/4/19 19:13:48
  19. 一次FRP使用笔记。。

    Sever 配置了7000端口进行sc服务交互&#xff0c; 配置nginx容器映射80端口&#xff0c;容器内部nginx监听容器80端口根据域名转发到宿主机19527端口 配置19527为http监听端口 配置19528为https监听端口 配置6500为ssh监听端口 Client 配置客户代理host:localhostport:19527…...

    2024/4/15 15:39:18
  20. 实时路径追踪篇 反射和折射

    这是4核多线程光线追踪效果 200200分辨率 就能拥有140帧率&#xff0c;在路径追踪的时候 反射和折射1帧就能得到不错的效果...

    2024/4/24 14:18:31

最新文章

  1. java-注解

    简介 自定义注解 定义 // 自定义注解 public interface MyAnnotation {// 注解的属性// value是注解的一个属性&#xff0c;如果只有一个属性&#xff0c;建议使用valueString value() default "";boolean enabled() default true;String[] exclude() default {}; }使…...

    2024/4/28 13:54:18
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. JavaEE 初阶篇-生产者与消费者模型(线程通信)

    &#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…...

    2024/4/24 13:18:03
  4. 比nestjs更优雅的ts控制反转策略-依赖查找

    一、Cabloy5.0内测预告 Cabloy5.0采用TS对整个全栈框架进行了脱胎换骨般的大重构&#xff0c;并且提供了更加优雅的ts控制反转策略&#xff0c;让我们的业务开发更加快捷顺畅 1. 新旧技术栈对比&#xff1a; 后端前端旧版js、egg2.0、mysqljs、vue2、framework7新版ts、egg3…...

    2024/4/24 14:34:44
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57