因此,我了解Node.js的工作原理:它有一个侦听器线程,它接收一个事件,然后将其委托给一个工作池.工作线程在完成工作后通知侦听器,然后侦听器将响应返回给调用者.
我的问题是:如果我在Node.js中站起来一个HTTP服务器并在我的一个路由路径事件(例如"/ test/sleep")上调用sleep,整个系统就会停止运行.甚至是单个监听器线程.但我的理解是这个代码发生在工作池上.
现在,相比之下,当我使用Mongoose与MongoDB通信时,DB读取是一种昂贵的I/O操作.Node似乎能够将工作委托给一个线程并在完成时接收回调; 从DB加载所花费的时间似乎并没有阻止系统.
Node.js如何决定使用线程池线程与侦听器线程?为什么我不能编写睡眠的事件代码并且只阻塞线程池线程?
我StackExchange.Redis用来与3个不同的Redis实例通信:1个在同一个子网上,2个在远程.这是我的配置代码:
var configurationOptions = new ConfigurationOptions
{
EndPoints =
{
{ host, port }
},
KeepAlive = 180,
Password = password,
DefaultVersion = new Version("2.8.5"),
// Needed for cache clear
AllowAdmin = true
};
var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );
Run Code Online (Sandbox Code Playgroud)
最后一行大约70%的时间抛出连接异常:
无法连接到redis服务器; 要创建断开连接的多路复用器,请禁用AbortOnConnectFail
为什么这是间歇性的和/或我做错了什么?当我在命令提示符下ping Redis服务器时,丢包率为0%,响应时间<1 ms.网络稳定.
谢谢!
编辑
以下是失败时日志输出的内容:
10.48.68.28:6379,keepAlive=180,version=2.8.5
1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone …Run Code Online (Sandbox Code Playgroud) 我非常熟悉,ReaderWriterLockSlim但我EnterUpgradeableReadLock()最近在一个类中尝试实现...不久之后我意识到当2个或更多线程运行代码时,这几乎肯定是一个保证死锁:
Thread A --> enter upgradeable read lock
Thread B --> enter upgradeable read lock
Thread A --> tries to enter write lock, blocks for B to leave read
Thread B --> tries to enter write lock, blocks for A to leave read
Thread A --> waiting for B to exit read lock
Thread B --> waiting for A to exit read lock
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
编辑
添加了我的场景的代码示例.该Run()方法将由两个或多个线程同时调用.
public class Deadlocker
{
private readonly ReaderWriterLockSlim _lock …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个表达式树,它从类派生参数并调用它们来设置另一个类中的值.它适用于大多数类型,但在派生类型上失败.如果我有:
public class A
{
public string MyString {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
和
public class B : A
{
}
Run Code Online (Sandbox Code Playgroud)
如果我使用此表达式树代码(其中value是派生实例):
// Get the type of the object for caching and ExpressionTree purposes
var objectType = value.GetType();
// Define input parameter
var inputObject = Expression.Parameter( typeof( object ), "value" );
var properties = objectType.GetProperties( BindingFlags.Instance | BindingFlags.Public );
foreach (var property in properties)
{
Expression.Property( Expression.ConvertChecked( inputObject, property.DeclaringType ), property.GetGetMethod() )
}
Run Code Online (Sandbox Code Playgroud)
我会收到这个例外:
{System.ArgumentException: The method 'My.Namespace.A.get_MyString' is not …Run Code Online (Sandbox Code Playgroud)