• python 多线程和多进程的区别 mutiprocessing theading


    多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。

     1 #!/usr/bin/python
     2 # -*- coding:utf-8 -*-
     3 import os
     4 import threading
     5 import multiprocessing
     6 count_thread = 0
     7 count_process = 0
     8 
     9 # worker function
    10 def worker1(sign, lock):
    11     global count_thread
    12     lock.acquire()
    13     count_thread += 1
    14     print(sign, os.getpid())
    15     lock.release()
    16 
    17 def worker2(sign, lock):
    18     global count_process
    19     lock.acquire()
    20     count_process += 1
    21     print(sign, os.getpid())
    22     lock.release()
    23 # Main
    24 print('Main:',os.getpid())
    25 
    26 # Multi-thread
    27 record = []
    28 lock  = threading.Lock()
    29 for i in range(5):
    30     thread = threading.Thread(target=worker1,args=('thread',lock))
    31     thread.start()
    32     record.append(thread)
    33 
    34 for thread in record:
    35     thread.join()
    36 
    37 # Multi-process
    38 record = []
    39 lock = multiprocessing.Lock()
    40 for i in range(5):
    41     process = multiprocessing.Process(target=worker2,args=('process',lock))
    42     process.start()
    43     record.append(process)
    44 
    45 for process in record:
    46     process.join()
    47 
    48 
    49 print count_thread
    50 print count_process
    View Code

    运行结果

    ('Main:', 3142)
    ('thread', 3142)
    ('thread', 3142)
    ('thread', 3142)
    ('thread', 3142)
    ('thread', 3142)
    ('process', 3148)
    ('process', 3149)
    ('process', 3150)
    ('process', 3151)
    ('process', 3152)
    5
    0

    应该尽量避免多进程共享资源。多进程共享资源必然会带来进程间相互竞争。而这种竞争又会造成race condition,我们的结果有可能被竞争的不确定性所影响。但如果需要,我们依然可以通过共享内存和Manager对象这么做。

    1) 共享内存

    用Python实现的例子:

     1 import multiprocessing
     2 
     3 def f(n, a):
     4     n.value   = 3.14
     5     a[0]      = 5
     6 
     7 num   = multiprocessing.Value('d', 0.0)
     8 arr   = multiprocessing.Array('i', range(10))
     9 
    10 p = multiprocessing.Process(target=f, args=(num, arr))
    11 p.start()
    12 p.join()
    13 
    14 print num.value
    15 print arr[:]
    View Code

    这里我们实际上只有主进程和Process对象代表的进程。我们在主进程的内存空间中创建共享的内存,也就是Value和Array两个对象。对象Value被设置成为双精度数(d), 并初始化为0.0。而Array则类似于C中的数组,有固定的类型(i, 也就是整数)。在Process进程中,我们修改了Value和Array对象。回到主程序,打印出结果,主程序也看到了两个对象的改变,说明资源确实在两个进程之间共享。

    2)Manager

    Manager对象类似于服务器与客户之间的通信 (server-client),与我们在Internet上的活动很类似。我们用一个进程作为服务器,建立Manager来真正存放资源。其它的进程可以通过参数传递或者根据地址来访问Manager,建立连接后,操作服务器上的资源。在防火墙允许的情况下,我们完全可以将Manager运用于多计算机,从而模仿了一个真实的网络情境。下面的例子中,我们对Manager的使用类似于shared memory,但可以共享更丰富的对象类型。

     1 import multiprocessing
     2 
     3 def f(x, arr, l):
     4     x.value = 3.14
     5     arr[0] = 5
     6     l.append('Hello')
     7 
     8 server = multiprocessing.Manager()
     9 x    = server.Value('d', 0.0)
    10 arr  = server.Array('i', range(10))
    11 l    = server.list()
    12 
    13 proc = multiprocessing.Process(target=f, args=(x, arr, l))
    14 proc.start()
    15 proc.join()
    16 
    17 print(x.value)
    18 print(arr)
    19 print(l)
    View Code

    Manager利用list()方法提供了表的共享方式。实际上你可以利用dict()来共享词典,Lock()来共享threading.Lock(注意,我们共享的是threading.Lock,而不是进程的mutiprocessing.Lock。后者本身已经实现了进程共享)等。 这样Manager就允许我们共享更多样的对象。

    参考资料:

    http://blog.csdn.net/zhaozhi406/article/details/8137670

    http://www.xuebuyuan.com/1968817.html

  • 相关阅读:
    java 学习 —— AWT布局组件
    Java 学习 ——网络与通信
    Java 学习————线程直接通信
    Java 学习————多线程同步
    改善PHP开发方式的5种方法
    grep在linux操作系统php,pytho等开发中的应用
    CSS border边框属性教程(color style)
    css输入框文字点击消失输入文字颜色变深JQ特效
    DIVCSS5模块 上标题下简介列表DIV CSS布局
    DIV CSS position绝对定位absolute relative教程篇
  • 原文地址:https://www.cnblogs.com/sunny-smile/p/3957782.html
Copyright © 2020-2023  润新知