Skip to content

Instantly share code, notes, and snippets.

@soltanoff
Created August 23, 2023 20:37
Show Gist options
  • Select an option

  • Save soltanoff/32242b36f492ee8345c27af280c65b87 to your computer and use it in GitHub Desktop.

Select an option

Save soltanoff/32242b36f492ee8345c27af280c65b87 to your computer and use it in GitHub Desktop.
Multiprocessing: shared class instance
import asyncio
import random
import time
from concurrent.futures import ProcessPoolExecutor
from multiprocessing.managers import BaseManager, NamespaceProxy
class CustomManager(BaseManager):
pass
class ObjectProxy(NamespaceProxy):
_exposed_ = ('__getattribute__', '__setattr__')
class SomeClass:
a = 5
b = 10
def fill_parameters(self, a=None, b=None):
self.a = a or SomeClass.a
self.b = b or SomeClass.b
async def some_class_modificator(shared_some_class):
while True:
shared_some_class.a = random.randint(1, 100)
shared_some_class.b = random.randint(1, 100)
print(f'some_class_modificator: {shared_some_class.a=}, {shared_some_class.b=}')
await asyncio.sleep(1)
def async_context(shared_some_class):
asyncio.run(some_class_modificator(shared_some_class))
def sync_context(shared_some_class):
while True:
print(f'sync_context: {shared_some_class.a=}, {shared_some_class.b=}')
time.sleep(5)
PROCESS_FUNCTIONS = (
async_context,
sync_context
)
def main():
CustomManager.register('SomeClass', SomeClass, ObjectProxy)
with CustomManager() as manager:
shared_some_class = manager.SomeClass() # noqa
shared_some_class.fill_parameters(a=3, b=22)
with ProcessPoolExecutor(max_workers=2) as executor:
for func in PROCESS_FUNCTIONS:
executor.submit(func, shared_some_class)
if __name__ == '__main__':
main()
@soltanoff
Copy link
Author

sync_context: shared_some_class.a=5, shared_some_class.b=10
some_class_modificator: shared_some_class.a=88, shared_some_class.b=86
some_class_modificator: shared_some_class.a=61, shared_some_class.b=75
some_class_modificator: shared_some_class.a=74, shared_some_class.b=38
some_class_modificator: shared_some_class.a=83, shared_some_class.b=41
some_class_modificator: shared_some_class.a=3, shared_some_class.b=52
sync_context: shared_some_class.a=3, shared_some_class.b=52
some_class_modificator: shared_some_class.a=50, shared_some_class.b=85
some_class_modificator: shared_some_class.a=97, shared_some_class.b=29
some_class_modificator: shared_some_class.a=75, shared_some_class.b=80
some_class_modificator: shared_some_class.a=59, shared_some_class.b=57
some_class_modificator: shared_some_class.a=35, shared_some_class.b=63
sync_context: shared_some_class.a=35, shared_some_class.b=63
some_class_modificator: shared_some_class.a=49, shared_some_class.b=23

@soltanoff
Copy link
Author

An example with async because it doesn't matter what contexts

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment