0%

python | 进程池间的唯一类实例

这是一个业务场景。

首先在 Spring boot 中,有一个概念叫做 Spring IOC,通过注入,可以让某些类在整个项目周期有唯一实例。

多体现在数据库连接等。

目前,我 python 项目也有一个这样的场景。

  • redis「封装了 redis 各种操作的类」 需要全局唯一实例
  • 主线程创建 redis 实现类
  • redis 实现类可以传递给进程池中的进程,然后所有进程都使用一个实例

并且,除了 redis 还有可能创建 mysql 等。

在看这个值钱一定要看 python | 进程池、多进程共享自定义变量 BaseManager

其主要思路如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from concurrent.futures.process import ProcessPoolExecutor
from multiprocessing.managers import BaseManager


class A:
def __init__(self):
self.a = None
self.prov()

def prov(self):
self.a = 1

def test(self):
self.a = self.a + 1
print(str(self.a))


class T:
def __init__(self, c):
self.test = None
self.c = c
self.proc()

def proc(self):
self.test = A()

def test_a(self):
self.test.test()


def proc(d):
d["t"].test_a()


if __name__ == '__main__':
b = BaseManager()
b.register("T", T)
b.start()
t = b.T("123")

d = {}
d["t"] = t
process_pools = ProcessPoolExecutor(max_workers=4)
for i in range(10):
process_pools.submit(proc, d)
请我喝杯咖啡吧~