python多进程多线程下的计数及日志打印
注意点:
需要保证在多进程内的进程锁是同一个
需要保证在单进程中的多线程内线程锁是同一个
# 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