小编And*_*rew的帖子

Heroku上的Node.js Web Socket H15空闲连接超时

我们在Heroku上运行一个Node.js和Express应用程序,它将ws库用于实时Web套接字.下面是我们看到的众多H15超时的屏幕截图.

在此输入图像描述

我已经读过Heroku在55秒后终止任何空闲连接,但是当连接打开时,我们的套接字每5秒来回发送一次乒乓球.一段服务器代码如下:

var _this = this;

this.server.on('connection', function(ws){

    // check for a ping, respond with pong
    ws.on('message', function(data){
        data = data.toString('utf8');
        if (data === PING) {
            ws.send(PONG);
        }
    });

    ws.on('close', function(err){
        TL.logger.info('Socket closed: '+path);
        _this.sockets = _.filter(_this.sockets, function(_ws){
            return ws != _ws;
        });
    });

    ws.on('error', function(err){
        TL.logger.info('Socket error: '+path);
        _this.sockets = _.filter(_this.sockets, function(_ws){
            return ws != _ws;
        });
    });

    _this.sockets.push(ws);
});
Run Code Online (Sandbox Code Playgroud)

这是chrome中客户端插槽的图片:

在此输入图像描述

任何想法是如何防止空闲连接?

timeout heroku websocket node.js express

14
推荐指数
1
解决办法
2628
查看次数

写入后台Realm的数据不能立即提供给主Realm

我有如下设置:

// Queues
private static let mainQueue = dispatch_get_main_queue()
private static let writeQueue = dispatch_queue_create("com.tablelist.Tablelist.queue.realm.write", DISPATCH_QUEUE_SERIAL)

// Realms
private static let defaultRealm: Realm = try! Realm()

private static func getDefaultRealm(block: (Realm) -> ()) {
    Dispatch.async(mainQueue) {
        block(defaultRealm)
    }
}

private static func getWriteRealm(block: (Realm) -> ()) {
    Dispatch.async(writeQueue) {
        block(try! Realm())
    }
}
Run Code Online (Sandbox Code Playgroud)

最初我有一个,writeRealm但由于GCD不保证队列中的哪个线程运行,我被迫Realm在write func中每次创建一个新的.

然后我有一个公共功能:

/**
    Asynchronously write data to the realm
*/
public static func write(block: (Realm) -> ()) -> Promise<Realm> {
    let promise …
Run Code Online (Sandbox Code Playgroud)

realm swift

7
推荐指数
1
解决办法
1567
查看次数

在后台线程上写入后,Realm 通知何时传递到主线程?

我看到的崩溃要么不应该发生,要么很有可能发生,而且文档还不够清楚地说明原因。

更新:

尽管我不同意下面要求我将其分成多个 SO 问题的评论,但如果有人可以专注于这个问题,我认为这将有很大帮助:

通知何时发送到主线程?主线程上的结果是否可能与之前的 runloop 中的结果不同,而还没有得到通知?

如果这个问题的答案是肯定的,结果可能与之前的 runloop 不同而没有通知,那么我认为将其放入文档中的某个地方是至关重要的。

后台写入

首先,我认为回顾一下我已经在为写作所做的事情很重要。我所有的写入都是通过一种基本上如下所示的方法执行的(除了错误处理):

func write(block: @escaping (Realm) -> ()) {
    somePrivateBackgroundSerialQueue.async {
        autoreleasepool {
            let realm = try! Realm()
            realm.refresh()
            try? realm.write { block(realm) }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没什么疯狂的,在你的最后有很好的记录。

通知和表格视图

我在这里的主要问题是从后台线程写入通知后,何时将通知传送到主线程?我有一个由领域结果支持的复杂表格视图(多个部分,每 5 行广告)。我的主要数据源如下所示:

enum StoryRow {
    case story(Story) // Story is a RealmSwift.Object subclass
    case ad(Int)
}

class StorySection {
    let stories: Results<Story>

    var numberOfRows: Int {
        let count = stories.count
        return count + numberOfAds(before: count) …
Run Code Online (Sandbox Code Playgroud)

realm swift

5
推荐指数
1
解决办法
517
查看次数

从CIImage创建CVPixelBufferRef以写入文件

我正在编写一个自定义的Movie Recording应用程序,并已实现了AVAssetWriter和AVAssetWriterInputPixelBufferAdaptor,用于将帧写入文件.在DataOutputDelegate回调中,我尝试将CIFilter应用于sampleBuffer.首先,我得到一个CVPixelBufferRef,然后创建一个CIImage.然后我应用CIIFilter并获取生成的CIImage:

    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);

    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer];
    CIFilter *hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"];
    [hueAdjust setDefaults];
    [hueAdjust setValue: image forKey: @"inputImage"];
    [hueAdjust setValue: [NSNumber numberWithFloat: 2.094]
                 forKey: @"inputAngle"];

    CIImage *result = [hueAdjust valueForKey: @"outputImage"];

    CVPixelBufferRef newBuffer = //Convert CIImage...
Run Code Online (Sandbox Code Playgroud)

我将如何转换CIImage以便我可以:

    [self.filteredImageWriter appendPixelBuffer:newBuffer withPresentationTime:lastSampleTime];
Run Code Online (Sandbox Code Playgroud)

objective-c core-image core-video ios avassetwriter

3
推荐指数
1
解决办法
1万
查看次数

如何追踪Node.js和Express内存泄漏?

我们使用看似简单的Node.js和Express服务器为Angular.js项目提供服务,您可以在下面看到.它背后的想法是,如果客户端要求的服务器上存在一个文件,比如main.css,那么它将由快速静态中间件返回.否则我们假设它是一个像/ account这样的有角度的路由,我们返回index.html文件,以便Angular可以接管.

附上你可以看到Heroku上的内存尖峰然后Heroku正在杀死服务器并重新启动它.然后它的尖峰再次出现......

记忆模式

这是服务器:

    var newrelic = require('newrelic')
      , fs = require('fs')
      , express = require('express')
      , app = express()
      , ENV = process.env.NODE_ENV || 'development'
      , ENV_PROD = ENV == 'production'
      , port = process.env.PORT || 8080;

    console.log('ENV: ' + ENV);

    // force ssl
    app.use(function(req, res, next){
        if (ENV_PROD) {
            var protocol = req.get('x-forwarded-proto');
            if (protocol != 'https') {
                res.redirect(301, 'https://' + req.get('host') + req.url);
            } else {
                res.header('Strict-Transport-Security', 'max-age=31536000');
                next();
            }
        } else {
            next();
        }
    });

    // …
Run Code Online (Sandbox Code Playgroud)

memory memory-leaks heroku node.js express

2
推荐指数
1
解决办法
2390
查看次数