nodejs使用co,yield多线程调用出现问题

问题描述

nodejs使用co,yield多线程调用出现问题

代码
var express = require('express');
var co = require("co");
var router = express.Router();
var mongoBasedao = require('../dao/mongoBasedao');
var connectionName = "test";
var c1 = 0;
var c2 = 0;

router.post('/', function (req, res) {
test(req, res);
});

function test(req, res) {
co(function*() {
var result = yield mongoBasedao.count({}, connectionName);
console.log("count:" + result);
c1++;
console.log("c1:" + c1);
if (result > 10) {
var error = {
code: 10000,
msg: "max"
}
return yield Promise.reject(error);
}
var doc = {
"name": "wade",
"age": 15
};
yield mongoBasedao.insertOne(doc, connectionName);
c2++;
console.log("c2:" + c2);
var success = {
code: 0,
msg: "success"
}
return yield Promise.resolve(success);
}).then(function (result) {
res.json(result);
}, function (err) {
res.json(err);
});
}

用20个线程同时访问接口
打印结果如下:
c1:1
c1:2
c1:3
c1:4
c1:5
c1:6
c1:7
c1:8
c1:9
c1:10
c1:11
c1:12
c1:13
c1:14
c1:15
c1:16
c1:17
c1:18
c1:19
c1:20
c2:1
POST /test 200 472.196 ms - 26
c2:2
POST /test 200 172.747 ms - 26
c2:3
POST /test 200 170.743 ms - 26
c2:4
POST /test 200 170.503 ms - 26
c2:5
POST /test 200 174.534 ms - 26
c2:6
POST /test 200 171.628 ms - 26
c2:7
POST /test 200 173.442 ms - 26
c2:8
POST /test 200 172.652 ms - 26
c2:9
POST /test 200 173.263 ms - 26
c2:10
POST /test 200 169.502 ms - 26
c2:11
POST /test 200 171.763 ms - 26
c2:12
POST /test 200 178.748 ms - 26
c2:13
POST /test 200 178.974 ms - 26
c2:14
POST /test 200 176.588 ms - 26
c2:15
POST /test 200 174.458 ms - 26
c2:16
POST /test 200 181.835 ms - 26
c2:17
POST /test 200 181.779 ms - 26
c2:18
POST /test 200 183.717 ms - 26
c2:19
POST /test 200 184.358 ms - 26
c2:20
POST /test 200 184.225 ms - 26

我以为打印结果 应该为 c1 c2 c1 c2 c1 c2 c1 c2 可是结果却是 c1 ... c2...
这个是什么原因 怎么解决这个问题啊

解决方案

http://www.zhihu.com/question/32752866?sort=created

时间: 2024-09-11 15:42:38

nodejs使用co,yield多线程调用出现问题的相关文章

c++-C++多线程调用JNI的问题

问题描述 C++多线程调用JNI的问题 在主线程中可以findclass,但是在子线程中却找不到,找的是同一个class,在子线程正可以找到系统的类,比如java/long/String 解决方案 http://blog.csdn.net/booirror/article/details/37778283 这篇文章里,有一些介绍

c# 4 0-关于C#多线程调用的问题

问题描述 关于C#多线程调用的问题 我的窗体是MDI多文档窗体,我在主窗体顶部天界了菜单,点击菜单弹出子窗体,但是因为我要用到数据库,所以我想在点击窗体这块使用线程,但是提示错误说线程间操作无效: 从不是创建控件"MainWindow"的线程访问它.,我看到论坛中说用到委托,可是我还不会,请教大神. private void OpenTrainScheduleInquiryWindow() //线程用到的函数 { if (trainScheduleInquiry == null ||

.net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃?

问题描述 .net 服务多线程 调用非托管C++DLL 如何防止 服务崩溃? 有一个.net服务,服务中开了多线程.其中有一线程会去调用非托管C++DLL,并阻塞等待其返回值.其他线程同步做文件处理.数据状态更新等操作.现在调用非托管C++DLL的线程会因为非托管代码的问题,崩溃.这样整个服务也就崩溃了!需要人工去服务器上重启该服务!请问:如何防止整个服务崩溃?是否可以捕获非托管C++中的错误.因为已经try catch了,但什么都捕获不到,直接服务崩溃! 解决方案 这个应该要想办法解决C++

com-C++ COM组建多线程调用

问题描述 C++ COM组建多线程调用 2C 如题,CoInitialize(NULL)之后,在单线程当中没有问题.现在我新开一个线程,然后需要在线程当中调用COM中的几个接口,但是提示我是尚未调用CoInitialize请问各位大神如何在新开的线程当中访问COM接口的函数?谢谢了. 解决方案 多线程调用COM实例COM 多线程连接点调用 解决方案二: 在新创建的线程中也要CoInitialize(NULL) 先初始化

c# winform 多线程调用信息窗体

问题描述 c# winform 多线程调用信息窗体 想做一个多线程任务中的信息提示窗体.即在执行任务的过程中,如果一个线程需要向外界输出信息,那么就显示该信息窗体,并在窗体上显示信息内容,可以点击一个按钮关闭该窗体.如果其中一个线程调用了该窗体显示信息后没有关闭,其他线程调用该窗体时,则在原信息窗体上补充显示新的信息. 请各位大虾出手相助! 解决方案 可以使用自定义消息,多线程只向消息队列提交消息,信息窗体根据消息来处理显示问题

qt-QT线程内调用外部函数发送信号是否有正确?多线程调用外部函数需要注意哪些问题?

问题描述 QT线程内调用外部函数发送信号是否有正确?多线程调用外部函数需要注意哪些问题? 大家好,我在QT多线程编程时,在线程内部调用了一个外部函数,外部函数中使用了emit来发送信号,请问这样是否会存在问题?另外,在线程中调用外部函数时需要注意哪些问题? 解决方案 我编写的代码大概如下: class myThread:public QThread; class DeviceScaner:public QObject { Q_OBJECT public: DeviceScaner(); ~Dev

.net 多线程 调用接口

问题描述 .net 多线程 调用接口 情况是这样的,我做了一个定时器,每天某个时间调用接口,发送所有数据. 由于一次数据可能多条 所以做两个分页查询(先说明下 为了让没有数据的时候 不从复调用接口,所以每天只执行一次) 在下面必须添加Thread.Sleep();否则无法按for循环执行. public void StartOnHour_GuoQi(object sender, System.Timers.ElapsedEventArgs e) { //整点发送 if (e.SignalTime

link中用select调用一个函数,是不是多线程调用的?听说多线程可以节省时间?

问题描述 link中用select调用一个函数,是不是多线程调用的?听说多线程可以节省时间? link中用select调用一个函数,是不是多线程调用的?听说多线程可以节省时间? 解决方案 linq是串行的,要并行用plinq 参考:https://msdn.microsoft.com/zh-cn/library/dd997425.aspx

多线程调用静态方法

一.文章来由 项目需求,可能要在多线程中使用静态方法. 二.静态方法与线程安全 类的成员分为两类,静态成员(static member)和实例成员(instance member).静态成员属于类,实例成员则属于对象,即类的实例. 我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用.静态方法不对特定的实例操作,只能访问静态成员.实例方法可对特定的实例操作,既能访问静态成员,也能访问实例成员. 那么,在多线程中使用静态方法是否有线程安全问