再談并發

再談并發

上一篇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.pswp.cn/news/449575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449575.shtml
英文地址,請注明出處:http://en.pswp.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…