文章

python多进程多线程下的计数及日志打印


注意点:

  1. 需要保证在多进程内的进程锁是同一个

  2. 需要保证在单进程中的多线程内线程锁是一个

# logger.py
import multiprocessing
import threading
​
​
class Logger_test:
    def __init__(self, process_lock):
        self.counter = multiprocessing.Value('i', 0)  # 共享计数器
        self.process_lock = process_lock  # 进程锁
        self.thread_lock = None
​
    def set_thread_lock(self, thread_lock):
        self.thread_lock = thread_lock
​
    def increment(self):
        with self.process_lock:  # 确保跨进程安全
            with self.thread_lock:  # 确保同一进程内线程安全
                self.counter.value += 1
                print(self.counter.value, end="\n")
                return self.counter.value
​
    def get_count(self):
        with self.process_lock:
            return self.counter.value
​

# main.py
import multiprocessing
import threading
from logger import Logger_test
​
​
def thread_task(logger):
    for _ in range(100):
        num = logger.increment()
​
​
def process_task(p_logger):
    threads = []
    t_lock = threading.Lock()
    p_logger.set_thread_lock(t_lock)
    for _ in range(5):  # 每个进程启动5个线程
        thread = threading.Thread(target=thread_task, args=(p_logger,))
        threads.append(thread)
        thread.start()
​
    for thread in threads:
        thread.join()
​
​
if __name__ == "__main__":
    process_lock = multiprocessing.Lock()
    logger = Logger_test(process_lock)
​
    processes = []
    for _ in range(10):  # 启动3个进程
        process = multiprocessing.Process(target=process_task, args=(logger,))
        processes.append(process)
        process.start()
​
    for process in processes:
        process.join()
​
    print(f"最终计数器值: {logger.get_count()}")
​
​

License:  CC BY 4.0