python-多進程

進程是由系統自己管理的。

1:最基本的寫法

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)
    print(p.map(f, [1, 2, 3]))
[1, 4, 9]

2、實際上是通過os.fork的方法產生進程的

unix中,所有進程都是通過fork的方法產生的。

multiprocessing Process
os

info(title):
    title
    , __name__
    (os, ):  , os.getppid()
    , os.getpid()

f(name):
    info()
    , name

__name__ == :
    info()
    p = Process(=f, =(,))
    p.start()
    p.join()

3、線程共享內存

threading

run(info_list,n):
    info_list.append(n)
    info_list

__name__ == :
    info=[]
    i ():
        p=threading.Thread(=run,=[info,i])
        p.start()
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

進程不共享內存:

multiprocessing Process
run(info_list,n):
    info_list.append(n)
    info_list

__name__ == :
    info=[]
    i ():
        p=Process(=run,=[info,i])
        p.start()

[1]
[2]
[3]
[0]
[4]
[5]
[6]
[7]
[8]
[9]

若想共享內存,需使用multiprocessing模塊中的Queue

multiprocessing Process, Queue
f(q,n):
    q.put([n,])

__name__ == :
    q=Queue()
    i ():
        p=Process(=f,=(q,i))
        p.start()
    :
        q.get()

4、鎖:僅是對于屏幕的共享,因為進程是獨立的,所以對于多進程沒有用

multiprocessing Process, Lock
f(l, i):
    l.acquire()
    , i
    l.release()

__name__ == :
    lock = Lock()

    num ():
        Process(=f, =(lock, num)).start()

hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9

5、進程間內存共享:Value,Array

multiprocessing Process, Value, Array

f(n, a):
    n.value = i ((a)):
        a[i] = -a[i]

__name__ == :
    num = Value(, )
    arr = Array(, ())

    num.value
    arr[:]

    p = Process(=f, =(num, arr))
    p.start()
    p.join()

0.0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

#manager共享方法,但速度慢

multiprocessing Process, Manager

f(d, l):
    d[] = d[] = d[] = l.reverse()

__name__ == :
    manager = Manager()

    d = manager.dict()
    l = manager.list(())

    p = Process(=f, =(d, l))
    p.start()
    p.join()

    d
    l
# print '-------------'這里只是另一種寫法
# print pool.map(f,range(10))
{0.25: None, 1: '1', '2': 2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

#異步:這種寫法用的不多

multiprocessing Pool
time
f(x):
    x*x
    time.sleep()
    x*x

__name__ == :
    pool=Pool(=)
    res_list=[]
    i ():
        res=pool.apply_async(f,[i])   res_list.append(res)

    r res_list:
        r.get(timeout=10) #超時時間

0
1
4
9
16
25
36
0
1
49
4
64
9
81
16
25
36
49
64
81

同步的就是apply

原創文章,作者:黑白子,如若轉載,請注明出處:http://www.www58058.com/57605

(0)
黑白子黑白子
上一篇 2016-11-05 21:37
下一篇 2016-11-05 22:38

相關推薦

  • awk的基本原理

    awk的工作原理 一次讀取一行文本,按輸入分隔符進行切片,切成多個組成部分,將每片直接保存在內建的變量中,$1,$2,$3….,引用指定的變量,可以顯示指定斷,或者多個斷。如果需要顯示全部的,需要使用$0來引用??梢詫蝹€片斷進行判斷,也可以對所有斷進行循環判斷。其默認分隔符為空格 awk的基本用法格式awk [options…

    Linux干貨 2017-07-11
  • 軟件包管理器之二——YUM介紹及使用

    一、前言     之前我們介紹了RPM的應用(詳細請查看http://www.www58058.com/archives/6383),發覺RPM安裝軟件有一個很繁瑣的問題,那就是包與包之間的依賴關系,如果想正常安裝和使用軟件程序,就必須根據要求一步一步的解決軟件之間的依賴關系。那么如果程序使用的包很多,將會很消耗使用人…

    Linux干貨 2015-07-21
  • Tomcat性能優化-2

    修改Connector運行模式 啟用NIO 或 APR bio介紹 bio(blocking I/O,阻塞式I/O操作),表示Tomcat使用的是傳統的Java I/O操作 默認模式,性能最差,沒有經過任何優化處理和支持 nio模式 nio(non-blocking I/O),Java SE 1.4…

    Linux干貨 2016-09-19
  • N25第2周作業

    1.Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示 地址:博客園http://www.cnblogs.com/qingyangzi/p/6172100.html.

    Linux干貨 2016-12-13
  • Basic認證

    basic認證: (1) 定義安全域 [root@bluee htdocs]# mkdir admin [root@bluee htdocs]# vim admin/index.html 刷新瀏覽器,可以看到admin/index.html文件內容“Page FOR Adminstration” 編輯配置文件: 找個位置增加一個Directoty: <…

    Linux干貨 2016-08-05
  • 0805隨堂練習

    文本處理練習: 1.找出本機ip地址  [root@localhost ~]# ifconfig |head -2 |tail -1 |tr -s ' ' ':' |cut -d: -f3  10.1.252.221 2.查看本機分區最大的利用率  [root@localhost ~]# …

    Linux干貨 2016-08-07
欧美性久久久久