Hướng dẫn python atomic counter - máy đếm nguyên tử python

Làm thế nào tôi có thể dịch mã sau từ Java sang Python?

AtomicInteger cont = new AtomicInteger(0);

int value = cont.getAndIncrement();

Hướng dẫn python atomic counter - máy đếm nguyên tử python

Khi được hỏi ngày 8 tháng 5 năm 2014 lúc 16:37May 8, 2014 at 16:37

user2983041user2983041user2983041

1.7003 huy hiệu vàng19 Huy hiệu bạc29 Huy hiệu đồng3 gold badges19 silver badges29 bronze badges

2

Nhiều khả năng với một threading.Lock xung quanh bất kỳ cách sử dụng giá trị đó. Không có sửa đổi nguyên tử trong Python trừ khi bạn sử dụng pypy (nếu bạn làm, hãy xem __pypy__.thread.atomic trong phiên bản STM).

Đã trả lời ngày 8 tháng 5 năm 2014 lúc 16:41May 8, 2014 at 16:41

4

import itertools
cont = itertools.count()
value = next(cont)
0 Trả về một trình lặp sẽ thực hiện tương đương với
import itertools
cont = itertools.count()
value = next(cont)
1 trên mỗi lần lặp.

Example:

import itertools
cont = itertools.count()
value = next(cont)

Đã trả lời ngày 21 tháng 11 năm 2014 lúc 13:46Nov 21, 2014 at 13:46

Will Manleywill ManleyWill Manley

2.24721 Huy hiệu bạc17 Huy hiệu đồng21 silver badges17 bronze badges

10

Điều này sẽ thực hiện cùng một chức năng, mặc dù nó không bị khóa như tên 'AtomicInteger' sẽ ngụ ý.

Lưu ý các phương pháp khác cũng không bị khóa hoàn toàn - chúng dựa vào GIL và không di động giữa các phiên dịch viên Python.

class AtomicInteger():
    def __init__(self, value=0):
        self._value = int(value)
        self._lock = threading.Lock()
        
    def inc(self, d=1):
        with self._lock:
            self._value += int(d)
            return self._value

    def dec(self, d=1):
        return self.inc(-d)    

    @property
    def value(self):
        with self._lock:
            return self._value

    @value.setter
    def value(self, v):
        with self._lock:
            self._value = int(v)
            return self._value

Đã trả lời ngày 25 tháng 1 năm 2018 lúc 0:03Jan 25, 2018 at 0:03

user48956user48956user48956

13.8K18 Huy hiệu vàng85 Huy hiệu bạc144 Huy hiệu đồng18 gold badges85 silver badges144 bronze badges

7

Sử dụng thư viện

import itertools
cont = itertools.count()
value = next(cont)
2, điều tương tự có thể được viết bằng Python như:

import atomics


a = atomics.atomic(width=4, atype=atomics.INT)

value = a.fetch_inc()

Phương pháp này hoàn toàn không khóa.

Lưu ý: Tôi là tác giả của thư viện này

Đã trả lời ngày 10 tháng 11 năm 2021 lúc 16:57Nov 10, 2021 at 16:57

Hướng dẫn python atomic counter - máy đếm nguyên tử python

DOODSPAVDOODSPAVdoodspav

2603 Huy hiệu bạc10 Huy hiệu đồng3 silver badges10 bronze badges

9

8 năm và vẫn không có mã ví dụ đầy đủ cho tùy chọn threading.Lock mà không sử dụng bất kỳ thư viện bên ngoài nào ... Đây là:

import threading

i = 0
lock = threading.Lock()

# Worker thread for increasing count
class CounterThread(threading.Thread):
    def __init__(self):
        super(CounterThread, self).__init__()
        
    def run(self):
        lock.acquire()
        global i
        i = i + 1
        lock.release()


threads = []
for a in range(0, 10000):
    th = CounterThread()
    th.start()
    threads.append(th)

for thread in threads:
    thread.join()

global i
print(i)

Đã trả lời ngày 29 tháng 8 lúc 12:58Aug 29 at 12:58

Hướng dẫn python atomic counter - máy đếm nguyên tử python

Mikel Bmikel bMikel B

8031 Huy hiệu vàng5 Huy hiệu bạc17 Huy hiệu đồng1 gold badge5 silver badges17 bronze badges

1

Nguyên tử Python cho các loại dữ liệu được chia sẻ.

https://sharedatomic.top

Mô -đun có thể được sử dụng cho các hoạt động nguyên tử trong nhiều quy trình và nhiều điều kiện luồng. Python hiệu suất cao! Đồng thời cao, hiệu suất cao!

Ví dụ API nguyên tử với đa xử lý và nhiều luồng:

Bạn cần các bước sau để sử dụng mô -đun:

  1. Tạo chức năng được sử dụng bởi các quy trình trẻ em, tham khảo UINTAPIS, INTAPIS, BYTEARRAYAPIS, StringApis, Setapis, Listapis, trong mỗi quá trình, bạn có thể tạo nhiều luồng.

     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()
    
  2. Tạo Bytearray được chia sẻ

    a = atomic_bytearray(b'ab', length=7, paddingdirection='r', paddingbytes=b'012', mode='m')
    
  3. bắt đầu các quy trình / chủ đề để sử dụng bytearray được chia sẻ

     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')
    

Đã trả lời ngày 17 tháng 4 lúc 15:03Apr 17 at 15:03