并发收集支持删除指定项吗?

2024-02-09

非常简单:除了 ConcurrentDictionary (如果必须的话我会使用它,但这不是真正正确的概念),是否有任何并发​​集合(IPrducerConsumer 实现)支持基于项目或谓词的简单相等性删除特定项目定义删除条件?

说明:我有一个多线程、多阶段工作流算法,它从数据库中提取对象并将它们放入“启动”队列中。从那里,它们被下一阶段抓取,进一步处理,并塞入其他队列。这个过程还要经历几个阶段。同时,第一阶段由其主管再次调用,并将对象从数据库中提取出来,这些对象可以包括仍在处理中的对象(因为它们尚未完成处理,因此尚未重新保留标记集:他们完成了)。

我正在设计的解决方案是一个“工作中”的大师系列;当第一阶段检索对象进行处理时,对象会进入该队列,并在工作流的任何阶段完成必要的处理后将其重新保存到数据库中作为“已处理”后删除。当该对象位于该列表中时,如果第一阶段重新检索该对象,它将被忽略。

我本来计划使用 ConcurrentBag,但唯一的删除方法 (TryTake) 会从包中删除任意项目,而不是指定的项目(ConcurrentBag 是slow在.NET 4)中。 ConcurrentQueue 和 ConcurrentStack 也不允许删除除下一个项目之外的其他项目,留下 ConcurrentDictionary,它可以工作,但超出了我的需要(我真正需要的是存储正在处理的记录的 Id;它们在工作流程中不会改变)。


之所以没有这样的数据结构是因为所有集合的查找操作时间为O(n)。这些都是IndexOf, Remove(element)等等。他们都枚举所有元素并检查它们是否相等。

只有哈希表的查找时间为 O(1)。在并发场景中,O(n) 查找时间将导致集合的锁定时间很长。其他线程在此期间将无法添加元素。

在字典中,只有被哈希命中的单元格才会被锁定。当一个线程通过散列单元中的元素检查相等性时,其他线程可以继续添加。

我的建议是继续使用 ConcurrentDictionary。


顺便说一句,您是对的,ConcurrentDictionary 对于您的解决方案来说有点过大。您真正需要的是快速检查对象是否正在工作。 AHashSet将是一个完美的选择。那么它基本上什么也不做Add(element), Contains(element), Remove(element)。有一个ConcurrentHeshSet在java中的实现。对于 c# 我发现了这个:如何在.Net中实现ConcurrentHashSet https://stackoverflow.com/questions/4306936/how-to-implement-concurrenthashset-in-net不知道有多好。

作为第一步,我仍然会编写一个包装器HashSet接口周围ConcurrentDictionary启动并运行它,然后尝试不同的实现并查看性能差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并发收集支持删除指定项吗? 的相关文章

随机推荐

  • 使用亚马逊 s3,使用他们的服务器上传文件,但 URL 应该显示来自我的

    是否可以使用他们的服务器将文件上传到亚马逊S3 即我的服务器不应在上传过程中使用 我还希望 URL 显示为正在上传到我的服务器 这可能吗 Look here http docs amazonwebservices com AmazonS3
  • jQuery 图像缩放,悬停时显示详细信息

    我正在寻找一个 jQuery 插件 它可以缩放缩略图并显示有关图像的一些详细信息 或多或少与谷歌图像搜索相同 我发现了http www malsup com jquery hoverpulse http www malsup com jqu
  • babel-loader:模块构建失败:语法错误:在严格模式下删除局部变量

    我在用着babel loader in webpack使用自定义 babel plugin 将一些第三方代码转换为可以顺利通过 Webpack 捆绑器的格式 然而 当我的代码通过 babel 的解析器 babylon 运行来构建 AST 时
  • Docker 和设置 JVM 参数

    我需要在 Docker 容器中使用此类 JVM 选项运行 Java 应用程序 但我不知道在哪里可以设置它 我尝试使用 java Dcom 命令 但它不起作用 做这个的最好方式是什么 Dcom sun management jmxremote
  • 如何制作CRF++的模板文件?

    我是 CRF 的新手 我正在自学查看其手册 http crfpp googlecode com svn trunk doc index html source navbar templ http crfpp googlecode com s
  • Android 3.0 Canary 中未显示预览

    我已经开始使用最新的 Android Studio 3 0 但预览版遇到问题 它没有在预览选项卡中显示预览 这是我所做的
  • RuntimeError:线程“Dummy-1”中没有当前事件循环

    我正在开发一个带有 Python 后端和 Django 服务器的 Web 应用程序 我有一些树莓派 它们正在将数据发送到服务器 然后我应该从后端获取这些数据 我成功地在我的项目中做到了这一点 所以我对代码非常确定 现在我想将此功能集成到我的
  • WebSocket JS 的自定义标头

    我找到了一个简单的解决方案 使用 WebSocket 和基于 PHP 作为后端 js vuejs 作为前端的 Web 应用程序的自定义标头 我的应用程序应该连接到基于 Java 的 WebSocket 服务器以获取实时统计数据 受 Oaut
  • 如何默认在所有路由上将查询参数保留在角度5中?

    背景 用户使用参数调用应用程序的 url 并使用我的应用程序 在不同路由之间切换时 url 参数应在浏览器地址栏中保持可见 我必须在应用程序的每条路线上保留查询参数 这意味着如果我有网址 www example com app test i
  • 没有 App_Code 的 ASP.Net WCF 服务

    我想创建一个 WCF 服务 用于我的 ASP Net 网站 不是项目 该网站没有代码隐藏文件 这是传统 asmx 样式服务的一个选项 但没有appear用于 wcf 服务 或者将其代码存储在单独的代码项目中 并且仅由 svc 文件公开 我尝
  • 当违反测试超时时,NUnit 内部会做什么?

    当 NUnit 遇到超时时到底会做什么 我曾经认为它会通过抛出 TimeoutException 来中止测试 但这个测试证明并非如此 Test Timeout 100 ExpectedException typeof TimeoutExce
  • DELETE 请求出现巨大延迟,响应为 204,且 Objective-C 中没有内容

    我在使用 iOS 应用程序 我不是 iOS 开发人员 我负责该应用程序使用的 API 和删除请求时遇到问题 Api 使用没有 DELETE 请求内容的 204 响应 到目前为止 该响应对于所有客户端应用程序都运行良好 没有任何问题 问题是
  • tcl深度递归文件搜索,搜索带有*.c扩展名的文件

    使用旧答案在 tcl 中搜索文件 https stackoverflow com a 435094 984975 https stackoverflow com a 435094 984975 首先我们来讨论一下我现在在做什么 使用此功能
  • 查找分配给主驱动器的字母

    我正在尝试找到一个类似的函数Environ查找我的业务中的主驱动器已映射到特定 PC 上的哪个驱动器 使用文件路径 G Eworking SET Operations file 我知道我的电脑已被映射 因此该文件路径位于 G 驱动器内 但其
  • 如何从oracle的日期字段获取日期01-01-9999的时间(以毫秒为单位)

    我想从 oracle 的日期字段获取日期 01 01 9999 的毫秒数 我创建了下面的块来实现相同的目的 set serveroutput on declare base point constant timestamp to times
  • 创建接受任意数量的 void functor 的可变参数函数

    受到我上一个问题的启发 制作可变参数函数 它接受任意函子并返回输入函子的每个返回值的元组 https stackoverflow com questions 15059250 make variadic function which tak
  • 使用 iOS Storyboard 动态调整 UILabel 的高度

    我有一个标签 它是使用 iOS Storyboard 布局创建的 然而 标签的内容是动态的并且可以在运行时改变 如何确保标签的高度根据标签中的内容进行调整 I tried 将行数设置为 0 Setting Editor gt Size to
  • 更改Linux上的线程名称(htop)

    我有一个多线程应用程序 我希望 htop 作为示例 为每个运行的线程显示不同的名称 目前它显示的是用于运行主程序的 命令行 我尝试过使用 prctl PR SET NAME 但它仅适用于 top 并且该调用只能指定最多 16 个字节的名称
  • 烦恼 - 如何禁用 Eclipse 类路径条目警告

    我已经搜索了选项 但似乎找不到禁用这些警告的方法 诸如此类的警告 Classpath entry org eclipse jdt junit JUNIT CONTAINER 4 will not be exported or publish
  • 并发收集支持删除指定项吗?

    非常简单 除了 ConcurrentDictionary 如果必须的话我会使用它 但这不是真正正确的概念 是否有任何并发 集合 IPrducerConsumer 实现 支持基于项目或谓词的简单相等性删除特定项目定义删除条件 说明 我有一个多