Shared Value Python
User shared memory in python
Когда пишешь в расшаренную пямять требуется смотреть, чтобы не было переполнения ( пишу и думаю, что знал об этом из нескольких книг и сам себе выстрелил в ногу).
Вот простенький пример программы:
python 1.py
#!/usr/bin/env python
import argparse
import sys
from multiprocessing import Process
from multiprocessing.sharedctypes import Array
def set_value(value, new_value):
value.value = bytes(new_value, "utf-8")
def main():
parser = argparse.ArgumentParser(description="probe")
parser.add_argument("--value", type=str, help="Value to set", default="value")
args = parser.parse_args()
old_value = "value"
print(f"old value: {old_value}")
value = Array(
"c",
bytes(old_value, "utf-8"),
)
thread1 = Process(
target=set_value,
args=(value, args.value),
)
thread1.start()
thread1.join()
print(f"new value: {value.value}")
return True
if __name__ == "__main__":
sys.exit(main())
То есть мы пишем в общую память одно значение и выходим. Пример запуска:
# При таком запуске всё будет хорошо
❯ python 1.py --value=value
old value: value
new value: b'value'
# А здесь получаем переполнение
❯ python 1.py --value=value1
old value: value
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python3.10/multiprocessing/process.py", line 314, in _bootstrap
self.run()
File "/usr/lib/python3.10/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/home/nigredon1991/reps/monitor_radio/1.py", line 10, in set_value
value.value = bytes(new_value, "utf-8")
ValueError: byte string too long
new value: b'value'
Меня здесь смутил текст ошибки, не сразу понял в чём проблема, потому что не писал такие приложения ранее.
#python #shared_value #multiprocessing