再谈并发

再谈并发

上一篇python并发中讲到了,使用多进程,多线程,多任务来加快程序的运行。其中讲到的一点似乎有点问题,操作系统中线程是调度器的最小执行单位,那为何python中的多线程无法利用多核,只能在一个处理器上运行呢?因为python中有GIL(全局解释器锁)这么个东西,当然它只是cpython解释器的一个特性,其他解释器可能没有。

大学时总在想,学操作系统、计算机组成原理、数据结构有啥用啊?还不如学习如何使用hibernatestrutsspring。当你工作3年后,对如何使用这些工具再也提不起兴趣时或者想深入了解它到底为什么是那样时,你就会重新回过头来打量大学时学的这些底层知识。

也许你对下面一句话耳熟能详:

进程是资源分配的最小单位,线程是最小执行单位。

大学时读的完全是字面意思啊?并没有思考什么是进程,为何要搞出来个进程?好吧,下面又是我杜撰的。

进程是一个操作系统级别的概念,运行一个程序时往往需要各种资源,操作系统把一个程序以及运行时所需要的资源抽象成一个进程,这里的资源是存储资源和计算资源。各个进程的计算资源是由操作系统的调度器统一分配的,而不是一个进程永远霸占计算资源;因为进程使用的是虚拟内存地址,不同进程的同一虚拟地址可能映射到了不同的物理内存上,所以不同进程间的存储资源是不共享的。

因为进程的储存资源不共享,创建销毁和切换的开销比较大。所以出现了轻量级进程,即线程。线程是共享同一进程的存储资源的,一个进程可以创建若干线程。同时它也是调度器的最小执行单元,可见多线程是能利用多核处理器的。

java没有操作进程并发的类,官方暂时也不支持协程,但是有一些第三方库,比Quasar。下面是多线程的几种方式:

  1. 通过ThreadPoolExecutor
  2. 通过CompletableFuture
  3. 通过流的并行处理
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.*;
import java.util.stream.IntStream;public class ThreadPoolDemo {static String content = "1234567890abcdefghijklmnopqrstuvwxyz";static int size = 400;public static void a(){int cnt = Runtime.getRuntime().availableProcessors() * 2 + 1;ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(cnt);ArrayList<Future<?>> fs = new ArrayList<>(size);long start = System.currentTimeMillis();for(int i = 0; i < size; ++i){int seq = i;Future<?> f = threadPoolExecutor.submit(() -> createFile("a", seq));fs.add(f);}for(Future<?> f : fs){try {f.get();} catch (InterruptedException|ExecutionException e) {e.printStackTrace();}}System.out.println(String.format("%s = %s", "a", (System.currentTimeMillis() - start)));threadPoolExecutor.shutdown();}public static void b(){CountDownLatch countDownLatch = new CountDownLatch(size);long start = System.currentTimeMillis();for(int i = 0;i<size;++i){int seq = i;CompletableFuture.runAsync(()->createFile("b", seq)).whenComplete((r, e)->{countDownLatch.countDown();});}try {countDownLatch.await();System.out.println(String.format("%s = %s", "b", (System.currentTimeMillis() - start)));} catch (InterruptedException e) {e.printStackTrace();}}public static void c(){long start = System.currentTimeMillis();IntStream.range(0, size).parallel().forEach(e -> {createFile("c", e);});System.out.println(String.format("%s = %s", "c", (System.currentTimeMillis() - start)));}public static void createFile(String prefix, int name){File file = new File("D:/files/" + prefix + "_" + name);if(!file.exists()){try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}try (FileOutputStream fos = new FileOutputStream(file)) {fos.write(content.getBytes());} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {
//        a();//b();c();}}
复制代码

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

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

相关文章

centos6.8安装docker,kong-dashboard并实现页面访问

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我们通过kong-dashboard的admin-UI管理界面进行直观的查看。最终显示界面如图&#xff1a; 因为这个kong-dashboard要用到docker&#x…

leetcood学习笔记-204-计算质数

题目描述&#xff1a; 第一次提交;(超时)&#xff1a; class Solution:def countPrimes(self, n: int) -> int:count 0for i in range(2,n):for j in range(2,i1):if i%j 0 and j!i:breakif ji:count1return count 别人家的&#xff1a; 这题搜到一个非常牛逼的算法,叫做厄…

linux man

nameman - 即 manual &#xff0c;在线查看命令手册。 描述man 是一个系统手册&#xff0c;man 的每一个选项通常是命令名&#xff0c;查找显示选项中的每个相关联的手册页&#xff0c;默认操作按照指顺序&#xff0c;按屏打印显示。 下表显示手册章节号&#xff0c;以及它们包…

centos-install-kong-cassandra

转自&#xff1a;http://blog.54im.com/2016/12/15/centos-install-kong-cassandra/#前置阅读 对于一些传统的大型项目&#xff0c;传统的方式会有一些缺陷&#xff0c;比如说新人熟悉系统成本高&#xff08;因为整个系统作为一个整体&#xff0c;彼此会有一定的牵连&#xff0…

akshare做mfi策略

#!/usr/bin/env python # coding: utf-8#先引入后面可能用到的包&#xff08;package&#xff09; import pandas as pd import numpy as np import matplotlib.pyplot as plt#正常显示画图时出现的中文和负号 from pylab import mpl mpl.rcParams[font.sans-serif][SimHei] …

第二章学习小结

第二章学习小结 对比于上学期所学的知识&#xff0c;能切实感觉到这个学期的课程更加深入和抽象&#xff0c;在学习上难度也有所增加&#xff0c;虽然上个学期就听老师推荐过博客园&#xff0c;但是真正开始写博客还是第一次&#xff0c;最直观的感受就是在完成博客的过程中&am…

翁同龢后人向上海博物馆捐赠两件重要家藏

1月24日&#xff0c;翁万戈先生捐赠书画仪式在上海博物馆内举行。 上海博物馆 供图 1月24日&#xff0c;翁万戈先生捐赠书画仪式在上海博物馆内举行。 上海博物馆 供图 中新网上海1月24日电 (王笈)翁同龢后人翁以钧24日携夫人柳至善&#xff0c;代表翁万戈将两件翁氏家族的重要…

mysql数据库操作

连接mysql from sqlalchemy import create_engine import pandas as pd import numpy as np import matplotlib.pyplot as plt import pymssql from scipy.interpolate import interp1dfrom datetime import timedelta #正常显示画图时出现的中文和负号 from pylab import mpl…

AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。

如上图&#xff0c;想在数据透视表中只显示红色区域的内容&#xff0c;手动勾选就比较繁琐。 实现思路&#xff1a; 先复制红色的内容。鼠标停留在数据透视表【型号】列的任意数据上&#xff08;通过该单元格可以获取数据透视表和字段&#xff09;由于数据透视表的字段不能全部…

SQL中的case when then else end用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Case搜索函数…

HEVC/H265 性能分析

HEVC/H265 标准中的目标是&#xff1a;H264的码率一般&#xff0c;质量一样&#xff0c;是否达到&#xff0c;数据说话。 下面是视频编解码大师测试数据&#xff1a; HEVC: is it really twice as good as H.264? The new standard for video compression, High Efficiency V…

“90后”台湾籍乘务长的第一个大陆春运

中新网上海1月25日电 题&#xff1a;“90后”台湾籍乘务长的第一个大陆春运 中新网记者 李佳佳 黄佳莹&#xff0c;“90后”的台北妹子。年纪虽小&#xff0c;资历却不浅&#xff0c;2018年她晋升为春秋航空客舱部乘务长&#xff0c;成为大陆首批台湾籍乘务长之一。“90后”台湾…

mysql+tushare搭建本地数据库

创建股票数据库 #!/usr/bin/env python # -*- coding: utf-8 -*- # Date : 2018-09-04 14:34:59 # Author : Michael Li # Version : $V2.0$import pandas as pd import numpy as np import datetime import random import pymssql from sqlalchemy import create_engine …

hbase单机搭建

一、下载 https://hbase.apache.org/downloads.html  2.1.3版本 解压&#xff0c;拷贝到文件夹 /hbase/hbase-2.1.3 设置HBASE_HOME环境变量&#xff0c;把它加到path环境变量中去 source /etc/profile 二、配置 &#xff11;.在/data下创建目录 mkdir /data/hbase mkdir /d…

mysql查询报错: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的情况 &#xff1a; Mysql 5.7.21 版本运行sql 报错如题&#xff0c;同样的 sql 直接本地运行不报错。 但是当连接的是服务器上的 …

多股票投资组合+马科维茨计算组合

import matplotlib.pyplot as plt from pandas import read_excel import numpy as np import tushare as ts import pandas as pd import datetime token prots.pro_api(token) 获取财务数据 #获取财务数据 ticker_list [601318.SH,601336.SH,601398.SH,601888.SH,603993.S…

并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析

以前写过介绍HashMap的文章&#xff0c;文中提到过HashMap在put的时候&#xff0c;插入的元素超过了容量&#xff08;由负载因子决定&#xff09;的范围就会触发扩容操作&#xff0c;就是rehash&#xff0c;这个会重新将原数组的内容重新hash到新的扩容数组中&#xff0c;在多线…

[边分治+线段树合并]「CTSC2018」暴力写挂

题目梗概 给出两棵1为根的树,求\(d[x]d[y]-d[lca(x,y)]-d[lca(x,y)]\)的最大值 解题思路 套路化简之后\((d[x]d[y]dis(x,y)-2*d[lca(x,y)])/2\) 第二棵树上的lca化不掉,所以考虑在第二棵上枚举lca 先说说这题的解法,边分树的合并. 边分和点分有什么区别,边分在合并类似\(d[x]d[…

HEVC/H265 文档获得

HEVC/H265文档是很重要的标准&#xff0c;因为代码有时由于效率问题而修改&#xff0c;这是最重要的参考&#xff1a; HEVC approved by ITU-T and ISO/IEC "Geneva, 25 January 2013 – A new video coding standard building on the PrimeTime Emmy award winning IT…