做网站的费用的会计分录/百度网站收录提交

做网站的费用的会计分录,百度网站收录提交,无锡建设工程信息网,企业公示信息系统官网本文由Markdown语法编辑器编辑完成。 1.背景 由于近日在改进一个医学图像的收图服务。之前的版本,我们采用了pynetdicom的服务。 https://pydicom.github.io/pynetdicom/stable/ 它的介绍为: pynetdicom is a pure Python package that implements the DICOM net…

本文由Markdown语法编辑器编辑完成。

1.背景

由于近日在改进一个医学图像的收图服务。之前的版本,我们采用了pynetdicom的服务。
https://pydicom.github.io/pynetdicom/stable/

它的介绍为:
pynetdicom is a pure Python package that implements the DICOM networking protocol. Working with pydicom, it allows the easy creation of DICOM Application Entities (AEs), which can then act as Service Class Users (SCUs) and Service Class Providers (SCPs) by associating with other AEs and using or providing the services available to the association.

是用python实现了DICOM的网络传输协议。这对于快速搭建服务,是很方便的一个选择。但是在实际的应用中,我们发现,如果医院同时有多个终端,比如多台CT机,多个PACS客户端,同时向它发送请求时,它的性能会遇到一定的瓶颈。

因此,我们最终还是采用了基于java的dcm4chee来实现。

具体在实现时,我们会遇到一个处理场景是,需要开启两个线程。
一个线程负责持续不断的接收CT机器发过来的图像;另一个线程,则需要定时不间断地(比如,每隔3s), 进行一次轮询,将符合一定条件的图像,拿走进行后续的处理。

这个场景,非常类似于银行账户。比如同一时刻或非常接近的时刻,有一个账户,有人往这个账户存钱,而有人则从这个账户取钱。那么这两个行为,就相当于是两个运行中的线程。而账户的钱,实际类似于数据库中的记录。一个线程,是要增加账户的钱,另一个账户,则是要减少这个账户的钱。
在这里插入图片描述

因此,如何来保证,这个账户的钱,计算是准确的呢。也即,如何确保两个线程,在修改同一个对象的值时,不至于发生错乱,导致不一致的情况呢?

我们会采用锁的机制。哪个线程先来访问,那么它就先拿到锁,然后进行一系列的操作,操作完成后,再释放锁。当另一个线程也需要访问这个对象时,如果发现被锁了,则会等待,直到这个锁被释放后,它才可以进行操作。

2. 问题根源

虽然我也知道多线程访问时需要上锁。但是在实际编写代码时,还是忽略了一个地方。导致,我加的定时轮询任务,在没有过多数据访问时,还是可以正常工作的。
但是一旦大量的数据过来时,定时任务就罢工了。因此,数据就变成了只进不出,造成了数据处理的堆积。

后来通过在代码的入口处,增加了try…catch的异常捕获逻辑。
再次运行时,可以看到在某一次定时任务运行的时候,发生了异常。异常的名称为ConcurrentModificationException。

顾名思义,这个异常就是说明了,有不同的线程,在同时修改一个变量(在我的项目,这里是一个HashMap)。也就是说,一个线程在往这个HashMap里面,新增元素;而另一个线程,则在轮询判断这个HashMap中是否有符合条件,应该被pop掉的元素。

解决方案:

2.1 使用迭代器

使用Iterator进行遍历和修改:在遍历集合时,使用Iterator的remove()方法来删除元素,而不是直接在集合上进行修改。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class AvoidConcurrentModification {public static void main(String[] args) {List<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);numbers.add(3);numbers.add(4);# 定义一个迭代器,通过遍历迭代器的方式,可以实现边迭代,边修改的操作。Iterator<Integer> iterator = numbers.iterator();while (iterator.hasNext()) {Integer number = iterator.next();if (number == 2) {iterator.remove(); // 使用迭代器的remove()方法}}}
}

2.2 使用并发集合(Concurrent Collections)

Java提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。这些集合类使用了特定的并发控制机制,可以在多线程环境下安全地进行遍历和修改操作。根据具体的需求,选择合适的并发集合类来代替普通的集合类。

2.3 使用同步(Synchronization)

如果你必须使用普通的集合类,并且需要在多线程环境下进行遍历和修改操作,你可以使用同步机制来确保线程安全。使用synchronized关键字或者使用Collections.synchronizedXXX()方法包装集合类,以确保每次只有一个线程可以访问集合的修改操作。比如:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;public class AvoidConcurrentModification {public static void main(String[] args) {List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());numbers.add(1);numbers.add(2);numbers.add(3);numbers.add(4);synchronized (numbers) {Iterator<Integer> iterator = numbers.iterator();while (iterator.hasNext()) {Integer number = iterator.next();if (number == 2) {iterator.remove();}}}}
}

2.4 使用线程锁

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;private Lock lock = new ReentrantLock();import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;public class AvoidConcurrentModification {List<Integer> numbers = Collections.synchronizedList(new ArrayList<>());public static void addItem(String[] args) {# 首先拿到线程锁lock.lock();numbers.add(1);numbers.add(2);numbers.add(3);numbers.add(4);# 处理完毕后,释放线程锁.lock.unlock();}public static void removeItem(String[] args) {# 首先拿到线程锁lock.lock();for (String item : numbers ) {if (item == 2) {numbers.remove(item);}# 处理完毕后,释放线程锁.lock.unlock();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于大语言模型的AI Agents

代理&#xff08;Agent&#xff09;指能自主感知环境并采取行动实现目标的智能体。基于大语言模型&#xff08;LLM&#xff09;的 AI Agent 利用 LLM 进行记忆检索、决策推理和行动顺序选择等&#xff0c;把Agent的智能程度提升到了新的高度。LLM驱动的Agent具体是怎么做的呢&a…

Hive调优——explain执行计划

一、explain查询计划概述 explain将Hive SQL 语句的实现步骤、依赖关系进行解析&#xff0c;帮助用户理解一条HQL 语句在底层是如何实现数据的查询及处理&#xff0c;通过分析执行计划来达到Hive 调优&#xff0c;数据倾斜排查等目的。 https://cwiki.apache.org/confluence/d…

Java安全 URLDNS链分析

Java安全 URLDNS链分析 什么是URLDNS链URLDNS链分析调用链路HashMap类分析URL类分析 exp编写思路整理初步expexp改进最终exp 什么是URLDNS链 URLDNS链是Java安全中比较简单的一条利用链&#xff0c;无需使用任何第三方库&#xff0c;全依靠Java内置的一些类实现&#xff0c;但…

网络专栏目录

大家好我是苏麟 , 这是网络专栏目录 . 图解网络 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 图解网络目录 基础篇 基础篇 TCP/IP网络模型有几层? : TCP/IP网络模型 键入网址到页面显示,期间发生了什么? : 键入网址到页面显示,期间发生了什么 现阶…

C++:面向对象——类的构造

1.1学会面向对象的编程思想 面向对象的英文缩写是OO&#xff0c;它是一种设计思想。 面向对象有3大特点&#xff1a;封装、继承和多态。 1.封装 封装有两个作用&#xff0c;一个是将不同的小对象封装成一个大对象&#xff1b;另外一个是把一部分内部属性和功能对外界屏蔽。…

数据结构哈希表

这里个大家用数组来模拟哈希表 法一&#xff1a;拉链法 法二&#xff1a;开放寻址法 /** Project: 11_哈希表* File Created:Sunday, January 17th 2021, 2:11:23 pm* Author: Bug-Free* Problem:AcWing 840. 模拟散列表 拉链法*/ #include <cstring> #include <iostr…

Gazebo无法显示模型 [Err] [InsertModelWidget.cc:403] Missing model.config for model

跟着教程一步步运行demo project时遇到了一个问题&#xff1a; 运行launch文件后&#xff0c;gazebo中世界文件加载了&#xff0c;但是机器人模型没有加载出来&#xff0c;之前没有遇到过这种情况。 后面发现&#xff0c;运行launch命令时&#xff0c;一直处在某个conda环境下&…

牛客——递归实现指数型枚举(枚举,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 从 1∼n1\sim n1∼n这 n (n≤16)(n \leq 16)(n≤16) 个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。 输入描述: 一个整数n。 输出描述: 每行一种方案。同一行内…

Vue学习笔记(三)常用指令、生命周期

Vue学习笔记&#xff08;三&#xff09;常用指令 vue指令&#xff1a;html标签上带有 v- 前缀的特殊属性&#xff0c;不同的指令具有不同的含义&#xff0c;可以实现不同的功能。 常用指令&#xff1a; 指令作用v-for列表渲染&#xff0c;遍历容器的元素或者对象的属性v-bind…

docker安装、运行

1、安装 之前有docker的话&#xff0c;需要先卸载旧版本&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 安装之前需要安装yum工具&#xff1a; sud…

SHA-512在Go中的实战应用: 性能优化和安全最佳实践

SHA-512在Go中的实战应用: 性能优化和安全最佳实践 简介深入理解SHA-512算法SHA-512的工作原理安全性分析SHA-512与SHA-256的比较结论 实际案例分析数据完整性验证用户密码存储数字签名总结 性能优化技巧1. 利用并发处理2. 避免不必要的内存分配3. 适当的数据块大小总结 与其他…

python 笔记:shapely(形状篇)

主要是点&#xff08;point&#xff09;、线&#xff08;linestring&#xff09;、面&#xff08;surface&#xff09; 1 基本方法和属性 object.area 返回对象的面积&#xff08;浮点数&#xff09; object.bounds 返回一个&#xff08;minx, miny, maxx, maxy&#xff09;元…

《乱弹篇(十三)明朝事儿》

2024年农历除夕夜&#xff0c;因追剧收看电视连续剧《后宫》而放弃了收看一年一度的《春晚》&#xff0c;至到春节&#xff08;农历正月初一&#xff09;晚才看完了《后宫》。 社交网站“必应”图片《后宫》 电视连续剧《后宫》&#xff0c; 讲的是明朝英宗末年的历史故事&…

python -m SimpleHTTPServer mac报错

错误内容&#xff1a; Traceback (most recent call last):File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main"__main__", fname, loader, pkg_name)File "/System/Libra…

【数据回顾】20240205千股跌停的信息面回顾

一、回顾过去 这是发生在2024年2月5日的事件&#xff0c;一千多只股票跌停&#xff0c;当时传闻的利空消息主要是&#xff1a; 1. 基金公司把基金持仓的股票转融通给别人做空&#xff0c;收融券利息&#xff0c;然后这利息还不算基金收益。 2. 上海机场发布&#xff0c;机场往来…

【更新】企业数字化转型-年度报告175个词频、文本统计

数据说明&#xff1a; 这份数据含数字化转型175个词频、各维度水平&#xff0c;保留2000-2021年数据。参考吴非、赵宸宇两位老师做法&#xff0c;根据上市公司年报文本&#xff0c;整理数字化转型175个词频数据&#xff0c;希望对大家有所帮助。 参考管理世界中吴非&#xff…

【达芬奇调色教程】

文章目录 第一章&#xff1a; 达芬奇软件基本了解1. 项目管理2. 新建项目3. 项目设置面板4. 偏好设置5. 界面布局 第一章&#xff1a; 达芬奇软件基本了解 1. 项目管理 前面的滑块可以控制缩略图的大小 2. 新建项目 项目管理器在操作本项目的时候&#xff0c;可以查看其他项目…

React18原理: 渲染与更新时的重点关注事项

概述 react 在渲染过程中要做很多事情&#xff0c;所以不可能直接通过初始元素直接渲染还需要一个东西&#xff0c;就是虚拟节点&#xff0c;暂不涉及React Fiber的概念&#xff0c;将vDom树和Fiber 树统称为虚拟节点有了初始元素后&#xff0c;React 就会根据初始元素和其他可…

WSL外部SSH连接有效方法

前言 wsl作为windows下使用linux平台有效的手段之一&#xff0c;本文可以让win作为工作站&#xff0c;外部系统用来连接win下的wsl系统。 自动启动服务脚本 https://zhuanlan.zhihu.com/p/47733615 开机自启端口转发 wslname "Ubuntu-20.04" 要转发端口的Linux…

图(高阶数据结构)

目录 一、图的基本概念 二、图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、图的遍历 3.1 广度优先遍历 3.2 深度优先遍历 四、最小生成树 4.1 Kruskal算法 4.2 Prim算法 五、最短路径 5.1 单源最短路径-Dijkstra算法 5.2 单源最短路径-Bellman-Ford算法 5.3 多源最…