'What is Atomic Operations in Python?
I'm a beginner in Python. Now I read about Threading and I have some questions.
IMO Atomic Operations (AO) = the simplest operation. the simplest operation in dev is a = 1. But I did read the article (http://preshing.com/20130618/atomic-vs-non-atomic-operations/) and I got the impression that it did not the simplest operation\AO. The author told us this operation divided into two operations and this operation wasn't AO. That this operation was AO it had to have another type. But I must say he told about C/C++ and bytecode, I think the same in Python. How I understood this depend on a type and maybe compiler. BUT Python is dynamic types of language. It has no types.
And I decided to ask the community these questions:
What are Atomic Operations in Python?
Which operations are AO in Python?
If the simple operation isn't simple then I do not understand what is Atomic Operations.
Solution 1:[1]
I developed one package shared_atomic which perform way better than multiprocessing and multithreads lock/Rlock. The module can be used for atomic operations under multiple processes and multiple threads conditions.
Environment,
LINUX/MacOSX
CPython 3.0 - 3.11
Pypy 3.0 - 3.9
Windows
CPython 3.0 - 3.11
Pypy not supported
Included Datatypes:
atomic_int
atomic_uint
atomic_float
atomic_bool
atomic_bytearray
atomic_string
atomic_set, package bitarray >= 2.4.0 is needed.
atomic_list, package bitarray >= 2.4.0 is needed.
Requirement,
LINUX/MacOSX
the package requires libatomic installed on Linux platform
cffi >= 1.0.0 <= 1.1.15 to compile through on Linux/MacOSX platform
gcc >= 4.8 to include the atomic APIs.
Windows
cppyy >= 1.5.0 <=2.3.1
only support single thread/multiple threads modes, multiprocessing mode is not supported on windows
Installation
To install shared_atomic, use pip:
pip install shared_atomic
Usage
create function used by child processes, refer to UIntAPIs, IntAPIs, BytearrayAPIs, StringAPIs, SetAPIs, ListAPIs, in each process, you can create multiple threads.
def process_run(a):
def subthread_run(a):
a.array_sub_and_fetch(b'x0F')
threadlist = []
for t in range(5000):
threadlist.append(Thread(target=subthread_run, args=(a,)))
for t in range(5000):
threadlist[t].start()
for t in range(5000):
threadlist[t].join()
create the shared bytearray
a = atomic_bytearray(b'ab', length=7, paddingdirection='r', paddingbytes=b'012', mode='m')
start processes/threads to utilize the shared bytearray
processlist = []
for p in range(2):
processlist.append(Process(target=process_run, args=(a,)))
for p in range(2):
processlist[p].start()
for p in range(2):
processlist[p].join()
assert a.value == int.to_bytes(27411031864108609,length=8,byteorder='big')
Currently concurrent.futures.ProcessPoolExecutor and concurrent.futures.ThreadPoolExecutor cannot be used to start multiple executions ,for serialization problems
Sourcecode Repo:
https://github.com/irvinren/shared_atomic.git
https://gitee.com/irvinren/shared_atomic.git
For documentation, please go to:
https://shared-atomic.readthedocs.io/en/latest/
The project is licensed under GPL v3.0
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
