atomic

Django ORM 事务操作

旧城冷巷雨未停 提交于 2020-12-06 05:56:39
事务 把一些列的操作(步骤)当作一个事务 全部的步骤都成功才成功 经典例子:银行转账 代码实现: import os if name == ' main ': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() import datetime from app01 import models ​ try: from django. db import transaction # 事务 with transaction. atomic(): # 里面是执行的所有步骤 new_publisher = models. Publisher. objects. create( name= "火星出版社") models. Book. objects. create( title= "橘子物语", publish_date= datetime. date. today(), publisher_id= 10) # 指定一个不存在的出版社id except Exception as e: print( str( e)) 来源: oschina 链接: https://my.oschina.net/u/4393984/blog/3795823

Does seq_cst ordering guarantee immediate visibility?

梦想与她 提交于 2020-12-05 12:45:22
问题 N3243 1.10.21 says It can be shown that programs that correctly use mutexes and memory_order_ seq_cst operations to prevent all data races and use no other synchronization operations behave as if the operations executed by their constituent threads were simply interleaved, with each value computation of an object being taken from the last side effect on that object in that interleaving. This is normally referred to as “sequential consistency”. Does this mean that any seq_cst writes on an

深入Linux并发同步

微笑、不失礼 提交于 2020-12-03 11:53:25
并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图(图片来源于网络): 上图的意思是,有两条在排队买咖啡的队列,并发只有一架咖啡机在处理,而并行就有两架的咖啡机在处理。咖啡机的数量越多,并行能力就越强。 可以把上面的两条队列看成两个进程,并发就是指只有单个CPU在处理,而并行就有两个CPU在处理。为了让两个进程在单核CPU中也能得到执行,一般的做法就是让每个进程交替执行一段时间,比如让每个进程固定执行 100毫秒 ,执行时间使用完后切换到其他进程执行。而并行就没有这种问题,因为有两个CPU,所以两个进程可以同时执行。如下图: 原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。如果有两个进程同时对一个共享变量 count 进行加一操作,由于C语言的 count++ 操作会被翻译成如下指令: mov eax , [ count ] inc eax mov [ count ], eax 那么在并发的情况下,有可能出现如下问题: 假设count变量初始值为0: 进程1执行完 mov eax, [count] 后,寄存器eax内保存了count的值0。 进程2被调度执行。 进程2执行 count++ 的所有指令,将累加后的count值1写回到内存。 进程1再次被调度执行

深入解析Linux并发同步

倖福魔咒の 提交于 2020-12-03 11:35:57
并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理多个任务的能力。并发和并行看起来很像,但实际上是有区别的,如下图: 上图的意思是,有两条在排队买咖啡的队列,并发只有一架咖啡机在处理,而并行就有两架的咖啡机在处理。咖啡机的数量越多,并行能力就越强。 linux内核的相关视频: 深度详解Linux内核网络结构及分布 epoll的具体实现与epoll线程安全|互斥锁|自旋锁|原子操作|CAS 手把手带你实现一个Linux内核文件系统 可以把上面的两条队列看成两个进程,并发就是指只有单个CPU在处理,而并行就有两个CPU在处理。为了让两个进程在单核CPU中也能得到执行,一般的做法就是让每个进程交替执行一段时间,比如让每个进程固定执行 100毫秒,执行时间使用完后切换到其他进程执行。而并行就没有这种问题,因为有两个CPU,所以两个进程可以同时执行。如下图: 【文章福利】小编推荐自己的C/C++Linux群:812855908!整理了一些个人觉得比较好的学习书籍、视频资料共享在里面,有需要的可以自行添加哦!~ 原子操作 上面介绍过,并发有可能会打断当前执行的进程,然后替切换成其他进程执行。如果有两个进程同时对一个共享变量 count 进行加一操作,由于C语言的 count++ 操作会被翻译成如下指令: mov eax , [ count ] inc eax mov

Using atomic arithmetic operations in CUDA Unified Memory multi-GPU or multi-processor

ⅰ亾dé卋堺 提交于 2020-11-29 10:43:40
问题 I am trying to implement a CUDA program that uses Unified Memory. I have two unified arrays and sometimes they need to be updated atomically. The question below has an answer for a single GPU environment but I am not sure how to extend the answer given in the question to adapt in multi-GPU platforms. Question: cuda atomicAdd example fails to yield correct output I have 4 Tesla K20 if you need this information and all of them updates a part of those arrays that must be done atomically. I would

tcpsock.v2 与 ecocache

不想你离开。 提交于 2020-11-25 08:07:46
  因为很不满意 tcpsock 的设计与实现,及有意专为譬如游戏服务器端开发设计一套 TCP 网络库,所以年初即有了 tcpsock.v2 的开发计划,于是粗略整理出了以下几条目标计划:     1) TcpConn 的 ID 类型由 uint32 升级为 uint64     2) 比较灵活的 Create / Config Options 支持     3) 以队列的方式实现数据发送等逻辑     4) 库代码最好不使用反射     5) 对游戏服务器端开发友好(TCP ONLY)     6) TcpServer 增加诸如 Iterate、Send、Kick 等常用接口     7) 回调、超时、重连等逻辑的整理优化与支持等   而截至目前,除了第 2 条, tcpsock.v2 基本初步实现了以上目标(譬如重连,可能在应用层实现更合适),但不少设计实现或还比较粗糙,我应该会在测试及使用中对之慢慢修补改进增强(不排除后期再开发一套全新的库)。其改动较大的部分设计实现,如下可见一斑(conn.go): // Copyright (C) 2018 ecofast(胡光耀). All rights reserved. // Use of this source code is governed by a BSD-style license. package tcpsock

美团面试总结

二次信任 提交于 2020-11-24 19:49:53
写在前面的话 夫妻俩带娃面试,也是够拼的。难为了老公,一点把握都没有,竟然还通过了一面,老天啊,止于二面,不后悔了,做以下总结,希望对自己以后的面试有帮助, 按映像深刻顺序 1.如何设计一个秒杀系统(开放题) 参考博客: http://blog.csdn.net/suifeng3051/article/details/52607544 看完博客后,归纳成自己的语言 可以从前端+服务器端+数据库端来回答 数据库比较脆弱,扛不住高并发请求,这些最好在服务器端都处理掉 前端:静态页面,避免重复提交,绑定请求IP 服务器端:网关层,避免恶意攻击,对于同一个userId限制请求 服务层:1.可以利用消息中间件来实现,缓存请求到队列中,数据库层订阅一定数量的请求 2.也可以利用缓存来实现写的操作(更多的是用来实现读操作) 2.原子操作类(Atomic)--原子类型的变量 参考博客: http://blog.csdn.net/u011116672/article/details/51068828 在java.util.concurrent.atomic包下,共有13个类,主要分为四种类型 原子更新基本数据类型:AtomicInteger,AtomicBoolean,AtomicLong 原子更新数组 原子更新引用类型 原子更新属性 解决问题:用来解决高并发,多线程的情况下变量值的改变(如自增)

并发编程学习笔记之线程安全(一)

痴心易碎 提交于 2020-11-24 19:03:56
最近在复习、整理之前学习的多线程的知识,本着 燃烧自己,照亮他人 的想法,把自己整理的一些关于多线程的学习笔记、心得分享给大家. 博主准备把自己关于多线程的学习笔记写成三个部分分享给大家: 基础、实战、测试&优化 这三个部分是一环扣一环的. 1.基础: 多线程操作的对象必须是线程安全的,所以构建线程安全的对象是一切的基础.这一部分讲的就是如何构建线程安全的类,和一些多线程的基础知识. 2. 实战: 构建好了线程安全的类,我们就可以用线程/线程池,去构建我们的并发程序了,如何执行任务?如何关闭线程池?如何扩展线程池?这里都会给你答案 3. 测试&优化: 构建好的程序会不会发生死锁? 如何优化程序? 如何知道运行的结果是否正确? 这一部分会 一 一为你解答. 好了废话不多说,本篇博客是系列的第一篇,我们来讲述一下 线程安全. 线程安全 在多线程环境下, 保证线程访问的数据的安全格外重要 .编写线程安全的代码, 本质上就管理状态的访问 ,而且通常是 共享的 、 可变的 状态. 状态:可以理解为对象的成员变量. 共享: 是指变量可以被多个线程访问 可变: 是指变量的值在生命周期内可以改变. 保证线程安全就是要在不可控制的并发访问中保护数据. 如果对象在多线程环境下无法保证线程安全,就会导致脏数据和其他不可预期的后果 有很多在单线程环境下运行良好的代码,在多线程环境下却有问题.例如自增操作:

写给小白看的线程和进程,高手勿入

左心房为你撑大大i 提交于 2020-11-24 03:31:15
计算机的核心是CPU,它承担了计算机的所有计算任务,CPU就像一个工厂,时刻在运行着,而操作系统管理着计算机,负责任务的调度、资源的分配和管理。 进程和线程都是计算机操作系统中的基本概念,在进程和线程之上有程序,应用程序是具有某种功能的程序,运行在操作系统中。 例如,我们的桌面上都会安装QQ、酷狗音乐、微信......等,这些就是程序。当我们点击QQ运行时,QQ正常运行,此时就会开启一个进程。 因此, 「程序是静态的,而进程是动态的,程序是作为进程的运行的载体,进程会随时间,会在某一时刻消亡。」 图片来源于网络 我们运行程序开启的进程,我们可以在任务管理器中可以查看,当我们再次点击QQ,登陆另一个账号的时候又会开启一个进程。 打个比喻:前面我们把CPU比作一个工厂,那么程序就好像工厂里面的车间。 图片来源于网络 但是,车间是静态的,车间中有多条流水线,进程就好比流水线,流水线是动态执行的,一个车间可以同时运行多条流水线,也可以只执行一条流水线或者一条流水线都不执行。 总结来说: 「程序可以包含多个进程,多个进程并发执行,相互独立,因此,进程也是系统进行资源分配和调度基本单位。」 当然,程序也可以没有启动进程,就好比车间中没有流水线,因为程序是静态的,而进程的有无就好比层间的流水线是否存在。 图片来源于网络 一条流水线上可以有很多工人,那些工人就好比是线程,一个员工就代表一个线程

Linux信号(Understanding Linux Kernel 3rd)

烈酒焚心 提交于 2020-11-21 06:13:39
总览 产生 内核或应用程序产生,一份简短的信息。 传递 挂起状态 非挂起状态 信号类型 发给进程的信号(所有线程共享) 发给线程的信号 处理者 进程信号是其中一个没有屏蔽这个信号的线程处理。 线程就是指定线程处理。 处理方式 do_signal 处理 创建对应的特定栈帧来处理。 信号处理函数 整个进程中的线程共享。 有默认也有自定义。 需要的信息也可以自定义。 信号的作用 简讯 一份简短的信息。 生产者是内核或进程。 处理者是具体的线程或者是进程组中符合处理条件的线程。 内容 标准的信号就只有一个数字。 32 位的整数,每一位对应一个信号位。 支持实时信号的系统是 64 位,即两个 long . 信号定义 trap -l 用上面的指令罗列出支持的信号。 在编程中一般是宏定义,然后每个宏对应一个数字。 #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGABRT 6 #define SIGIOT 6 #define SIGBUS 7 #define SIGFPE 8 #define SIGKILL 9 #define SIGUSR1 10 #define SIGSEGV 11 #define SIGUSR2 12 #define