首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更适合我的任务:后台工作人员还是线程池?

更适合我的任务:后台工作人员还是线程池?
EN

Stack Overflow用户
提问于 2013-02-04 07:15:12
回答 3查看 539关注 0票数 3

我有一个简单的web应用程序模块,它基本上接受从移动客户端应用程序在PageLoad上保存压缩文件的请求。

现在,我要做的是解压缩文件并读取其中的文件,并将其处理为further..including,将条目输入数据库。

更新:压缩文件及其内容的大小将相当小,因此服务器不应该承受太多的负载。

更新2:我刚刚读到了when IIS queues requests (在全局/应用程序级别)。那么,这是否意味着我不需要实现复杂的请求处理机制,而IIS可以自己处理应用程序呢?

更新3:我希望卸载下载的zip处理,这不仅是为了最小化开销(就性能而言),而且也是为了避免在处理文件并将记录更新到同一个表时出现table-locking问题。在多个设备请求页面和后台任务的情况下,并行更新数据库将导致异常。

到目前为止,我集中讨论了两个解决方案:

  • 实现并发/消息队列
  • 将文件处理代码实现为一个单独的工具,并在服务器上调度一个作业,以检查未处理的文件并对其进行串行处理。

倾向于Queuing Mechanism,我将尝试实现,因为它似乎不那么依赖于配置。v/s在服务器端手动配置作业/计划。

那么,你们有什么推荐给我的?

此外,在请求压缩文件并将其保存在服务器端之后,客户端和服务器端的连接就会被释放。不想给我的IIS带来负担。

想象一下,有几百个客户同时请求页面。

实际上,我以前都没有使用过它们,所以任何样品或者如何使用它们都会更受欢迎。

EN

回答 3

Stack Overflow用户

发布于 2013-02-04 07:51:08

我建议使用TPL和Rx扩展:您可以将解压缩的文件列表作为可观察的集合,并为每一项异步启动一个新任务。

票数 4
EN

Stack Overflow用户

发布于 2013-02-04 07:21:43

我建议建立一个排队系统。

当您收到一个文件时,您将将路径保存到线程同步队列中。同时,后台工作人员(最好是另一台机器)将检查这个队列中的新文件,并将条目排出队列以处理它。

这样,您就不会启动未知数量的线程(每个zip文件),并且可以在一个位置处理zip文件。这样,当负载变得太重时,您也可以更容易地将您的拉链处理代码移动到另一台计算机。您只需要访问一个公共队列。

最简单的方法可能是使用静态Queuelock-object。这是最容易实现的,不需要外部资源。但这将导致应用程序回收时队列丢失。

您提到丢失zip文件不是一个选项,如果您不想依赖外部资源,那么这种方法并不是最好的方法。根据负载的不同,可能值得利用外部资源--即将zip文件上传到另一台计算机上的公共存储中,并将消息添加到另一台计算机上的队列中。

下面是一个本地队列的示例:

代码语言:javascript
复制
ConcurrentQueue<string> queue = new ConcurrentQueue<string>();

void GotNewZip(string pathToZip)
{
    queue.Enqueue(pathToZip); // Added a new work item to the queue
}

void MethodCalledByWorker()
{
    while (true)
    {
        if (queue.IsEmpty)
        {
            // Supposedly no work to be done, wait a few seconds and check again (new iteration)
            Thread.Sleep(TimeSpan.FromSeconds(5));
            continue;
        }

        string pathToZip;
        if (queue.TryDequeue(out pathToZip)) // If TryDeqeue returns false, another thread dequeue the last element already
        {
            HandleZipFile(pathToZip);
        }
    }
}

这是一个非常粗略的例子。每当压缩到达时,就会将路径添加到队列中。同时,后台工作人员(或多个示例的threadsafe)将处理一个接一个的压缩,从队列中获取路径。压缩文件将按它们到达的顺序处理。

同时,您需要确保您的应用程序不回收。但是,对于本地机器上的所有资源来说,当您的机器崩溃时,这些资源就会丢失。

票数 1
EN

Stack Overflow用户

发布于 2017-07-13 01:09:37

我相信你是过早地优化了。

你提到了表锁定-你用的是哪种数据库?如果添加新行或更新现有行,大多数配置中的大多数现代数据库将:

  1. 使用行级锁定;以及
  2. 足够快,而不需要担心锁定。

我建议从一个简单的方法开始

代码语言:javascript
复制
        //Unzip
        //Do work
        //Save results to database

找点证据证明它太慢了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14681974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档