问题标签 [contention]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何使编写方法线程安全?
在将内容从对象写入文件时,我有多个线程调用一种方法,如下所示: 当我使用 1 个线程测试此方法时,预期会输出到我的文件中。但是,对于多个线程,文件的输出是混乱的。如何使这个线程安全?
编辑:
我添加了这一行 List<Result> results = ResultGenerator.getResult()
。我真正想要的是使用多个线程来处理这个方法调用,因为这部分很昂贵并且需要很多时间。写作部分很快,我真的不需要多线程。
鉴于此更改,有没有办法使此方法调用在并发环境中安全?
c# - 防止多个用户访问同一个文件夹 C#
我目前正在用 C# 编写一个小应用程序来处理批量图像并将它们放入 PDF 中。每批图像都存储在网络共享上自己的文件夹中。该应用程序将使用户能够在创建 PDF 之前对来自单个批次的随机数量的图像执行 QA 检查。最多有 4 到 6 个用户在单个桌面上运行此应用程序,并可以访问存储图像批次的位置。
我目前遇到的问题是如何防止 2 个用户处理同一个批次?最初我考虑使用 FileSystemWatcher 来检查对每个文件夹的最后访问,但是阅读 FileSystemWatcher 如何引发它似乎不合适的事件。我考虑过使用轮询来检查每个文件夹中的图像以使用文件流进行文件访问,但我认为这也不合适(我可能错了)。
什么是最简单的解决方案?
pthreads - 高争用应用程序中的 Pthread 策略
有人知道 pthread 在高争用和低争用情况下的行为吗?据我所知,有一个基于 unix 的策略 (SCHED_OTHER) 用于互斥体处理,它在争用方面优化了执行时间。我想知道 pthread 何时将其策略从 SCHED_FIFO 更改为 SCHED_RR ,反之亦然。pthread 如何检测争用(更改策略的阈值)?
java - 如何在应用程序级别处理行锁争用
我有 2 个应用程序(Spring - Hibernate with Boot)使用相同的 oracle 数据库(11g)。这两个应用程序始终命中特定表,并且该表上有大量命中。我们可以在数据库日志中看到行锁争用异常,并且每次我们得到这些异常或当它产生类似死锁的情况时都必须重新启动应用程序。
我们正在为这些应用程序使用 JPA 实体管理器。在这个问题上需要帮助
c# - TypeDescriptor.GetProperties() 始终返回相同的 PropertyDescriptorCollection 引用。导致并行处理问题
前言:我正在移动一个库以并行处理数据,并且线程之间存在 85%+ 的争用PropertyDescriptor.GetValue()
,这使得多核上的并行处理相同,有时甚至比单核上的处理更糟糕。
问题:
当TypeDescriptor.GetProperties(Type)
被调用时,它似乎返回对相同的相同引用PropertyDescriptorCollection
,它对所有相同的PropertyDescriptor
对象具有相同的引用。PropertyDescriptor
这是有问题的,因为我需要为每个线程创建新的集合。共享相同的资源会导致线程不断地相互阻塞。
粗略的例子:
在这种情况下,每个Object.ReferenceEquals都将返回 true。表明它们都指的是相同的对象,并且没有区别。当多个线程调用GetValue()
同一个PropertyDescriptor
对象时,这会导致严重的性能问题。
如何PropertyDescriptor
为每个对象属性获取全新的对象?
注意:PropertyInfo
通过检索也会出现同样的问题myType.GetProperties()
。它返回的PropertyInfo
s 引用了相同的对象,因此即使是在执行缓存。
附加信息/发现:
- 属性 getter 的 MethodInfo 也缓存在
PropertyInfo
. 因此,获取和调用该方法是不可并行的,因为它将依赖于所有线程的相同 MethodInfo 实例。 - ( ) 在使用
PropertyDescriptor
( )ReflectPropertyDescriptor
期间经历的过程,它使用属性信息缓存返回结果。GetValue()
Type.GetProperty()
RunTimeType.GetProperty()
- 这意味着
PropertyDescriptor
并且PropertyInfo
似乎使用相同的共享缓存来返回属性信息实例,它们都用于访问属性 getter 方法(也被缓存)。
- 这意味着
TL;DR:它一直是缓存。
python - 测试 W_OK 通过,尽管文件在 excel 中打开 - 为什么,以及如何测试?
这个小助手函数写入results
一个 excel 文件。如果文件已经存在并且overwrite
设置了标志,则应尽可能覆盖文件 - 即当文件未被任何其他应用程序(在本例中为 Excel)打开时:
问题是 W_OK 的测试通过了,即使文件是在 Excel 中打开的:
- 为什么呢
- 我应该如何测试对文件的写访问权限?
c# - 访问字典时改善锁争用的建议
这是我的第一篇文章,所以如果我错过了任何指导方针,请多多包涵。
我正在实现一个动态限制键的解决方案,它围绕一个必须在每个请求之前锁定的字典(因为多个线程可以同时请求和修改同一个键)。正如预期的那样,字典中的项目数无关紧要,但正在使用的线程数会增加锁争用。
如果我无法锁定字典,我会返回 OK,以免耽误调用者。每次成功锁定大约需要 5us,每次不成功大约需要 600uS。因此,锁争用不仅会导致可能被限制的密钥被允许继续进行,而且还需要大量时间。锁定机制是使用 Monitor.TryEnter。
测试参数:字典中的 20k 项,等权重
使用 10 个线程,我得到 140k tps,6% 的锁争用 使用 20 个线程,我得到 90k tps,10% 的锁争用 使用 30 个线程,我得到 80k tps,14% 的锁争用
虽然这些 TPS 数字高得离谱,可能永远不会在单个盒子上命中,但当访问线程的数量很高时问题仍然存在,即使 TPS 较低。
改善这种情况的最佳方法是什么?也许我可以为多个字典提供一个带有单独锁的分片机制,并单独查找以查找要使用的字典?
谢谢 :)
c# - 是什么导致 DriveInfo.IsReady 为假?
情况
我正在调试一些对目录路径执行一些存在性检查的遗留代码。首先,DirectoryPathA
检查并返回是否存在。这应该是通常的情况。如果失败,DirectoryPathB
则检查并返回。(如果这也失败了,会发生其他事情,而不是这个问题的一部分)。代码如下所示:
如您所见,第一个检查有一个基于DriveInfo.IsReady
. 之前网络上的文件访问存在问题,所以我的假设是(同样,这是遗留代码)引入它是为了在不可用时建立DirectoryPathB
作为替代方案。DirectoryPathA
我不知道为什么没有DriveInfo.IsReady
对DirectoryPathB
.
问题
即使DirectoryPathA
是本地目录(所以没有网络中断),上面的代码偶尔会返回DirectoryPathB
. 代码被执行了几次,并被假定为幂等的,但事实并非如此,这会破坏事情。这只会在几个小时内偶尔在某些机器上发生。我无法重现该问题。
假设驱动器状态在整个程序执行过程中永远不会改变,这是一个基本问题。我明白那个。然而,这段代码似乎大部分时间都很好,而且过去一直如此。
问题
DriveInfo.IsReady
可能是什么原因false
?
该文件指出
true
如果驱动器准备好了;false
如果驱动器未准备好。
什么都不感谢。备注部分添加
IsReady 指示驱动器是否准备就绪。例如,它指示 CD 是否在 CD 驱动器中或可移动存储设备是否已准备好进行读/写操作。如果您不测试驱动器是否准备好,并且它还没有准备好,使用 DriveInfo 查询驱动器将引发 IOException。
- 它不是可移动驱动器。我们说的是老生常谈
C:\
。 - 这不是权限问题,因为它有时适用,有时不适用于同一用户。
- 这不是驱动器由于省电模式而变得不可用的问题,因为
- 省电模式未激活并且
- 这是一个SSD。
旧文档指出
线程安全
这种类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
DriveInfo.IsReady
这是否意味着false
其他线程同时在驱动器上执行某些操作?甚至有必要DriveInfo.IsReady
为了true
检查目录是否存在?
c# - 在 c# 中使用 foreach 重复更新数据实体时出现争用错误
当服务器请求每秒多次更新该实体时,如何优化实体的更新?用于更新的方法开发如下:
这是错误:
InvalidOperationException: An error occurred, Grpc.Core.RpcException: Status(StatusCode=Aborted, Detail="too much contention on these datastore entity. please try again. entity groups: [(app=p~******** , *********, "76fcb9c1-009e-****-b54f-68a45e9c****")]")
google-app-engine - 数据存储查询期间的 GAE 推送队列数据库争用
总结 我有一个问题,数据库从我的任务队列中写入(大约 60 个任务,以 10/s 的速度)在并发数据库读取期间以某种方式被覆盖/丢弃相同的数据。我将解释它是如何工作的。任务队列中的每个任务都为模型的特定数据存储实体分配一个唯一 ID。如果我在模型上运行索引数据存储查询并在任务队列正在进行时遍历实体,我希望某些实体将被任务队列操作(即..分配一个 ID)和其他实体尚未生效。不幸的是,似乎正在发生的事情是在查询循环期间,已经操作过的实体(即..成功分配了一个 ID)被覆盖或丢弃,说它们从未被操作过,即使 - 根据我的日志- 他们进行了手术。
为什么会这样?我需要能够在不影响后台任务队列写入操作的情况下读取我的数据状态。我想这可能是一个缓存问题,所以我尝试在查询中强制执行 use_cache=False 和 use_memcache=False ,但这并没有解决问题。任何帮助,将不胜感激。
其他有趣的注意事项:如果我在执行数据存储查询之前 允许任务队列完全完成,然后执行数据存储查询,它会按预期运行,并且不会覆盖/丢弃任何内容。