python多进程入门、分布式进程数据共享

python多进程入门

https://docs.python.org/3/library/multiprocessing.html

1、先来个简单的

# coding: utf-8

from multiprocessing import Process

# 定义函数
def addUser():
    print("addUser")

if __name__ == "__main__":

    p1 = Process(target=addUser)
    p1.start()

多进程包multiprocessing
创建进程p1 = Process(target=函数名);
开始进程p1.start()

2、通过进程ID来区分父子进程

# coding: utf-8

from multiprocessing import Process
import os

# 定义一个list
myList = ["a","b"];
# 定义函数
def addUser(list):
    print(os.getpid()) # 进程ID
    print(os.getppid()) # 父进程ID

if __name__ == "__main__":

    p1 = Process(target=addUser,args=(myList,))
    p1.start()

    # 这里是主进程
    print("父进程ID:"+str(os.getpid()))  # 进程ID
父进程ID:27084
27085
27084

3、主进程等等子进程执行完毕

# 定义一个list
myList = ["a","b"];
# 定义函数
def addUser(list):
    list.append("c")
    print(list)

if __name__ == "__main__":

    p1 = Process(target=addUser,args=(myList,))
    p1.start()

    print(myList)
['a', 'b']
['a', 'b', 'c']

主线程的print(myList)先于子进程的print(list)执行。

在主进程里,只需要加一句代码:

    p1.join() # 等待子进程执行完毕
    print(myList)
['a', 'b', 'c']
['a', 'b']

执行的顺序就不一样了。

分布式进程数据共享

通过Manager实现数据共享。
Manager会创建一个服务进程,其他的进程都统一来访问这个server进程,从而达到多进程之间的数据通信。
一旦主进程结束,则server进程也讲结束

1、不多说,直接上代码

# coding: utf-8

from multiprocessing import Process, Manager


# 定义函数
def addUser(list):
    list.append("c") # 给list添加了一个元素
    print(list)

if __name__ == "__main__":
    mgr = Manager()
    my_list = mgr.list(["a","b"]) # 通过Manager对象创建list

    p1 = Process(target=addUser,args=(my_list,))
    p1.start()

    p1.join()
    print(my_list)

注意2次打印list,在子进程(addUser())里还改变了list数据。我们看看2次打印结果:

['a', 'b', 'c']
['a', 'b', 'c']

说明通过Manager对象创建的list数据能够在进程之间通信了。

2、分布式的数据共享
https://docs.python.org/3/library/multiprocessing.html

2.1、创建一个server

datamgr.py内容如下:

# coding: utf-8

from multiprocessing.managers import BaseManager


if __name__ == "__main__":
     mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
     mgr.register("getUser", callable=lambda :["a","b"])

     # server永不关闭
     server = mgr.get_server()
     server.serve_forever()

作为数据提供者。

2.2、在test.py里(可能是另外一台服务器里) 连接这个server

# coding: utf-8

from multiprocessing import Process, Manager
from multiprocessing.managers import BaseManager

if __name__ == "__main__":

    mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
    mgr.register("getUser")
    mgr.connect() # 连接远程的server

    my_list = mgr.getUser() # 从server获取数据

    print(my_list) # ['a', 'b']

连上了,并获取到了数据。

3、创建2个子进程,修改list数据,看看是不是能够共享?

# 定义函数
def addUser(list):
    list.append("c")

def addUser2(list):
    list.append("d")

if __name__ == "__main__":

    mgr = BaseManager(address=('127.0.0.1', 50000), authkey=b'password')
    mgr.register("getUser")
    mgr.connect() # 连接远程的server

    my_list = mgr.getUser() # 从server获取数据


    # 创建2个子进程
    p1 = Process(target=addUser,args=(my_list,))
    p1.start()

    p2 = Process(target=addUser2, args=(my_list,))
    p2.start()

    # 等待2个子进程执行完毕
    p1.join()
    p2.join()

    # 在主进程打印最终的list
    print(my_list) # ['a', 'b', 'c', 'd']

显然,在子进程里往list添加数据有效。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值