# -*- coding: UTF-8 -*-
from multiprocessing import Pool, Lock, Value
import os
tests_count = 80
lock = Lock()
counter = Value('i', 0) # int type,相当于java里面的原子变量
def run(fn):
global tests_count, lock, counter
with lock:
counter.value += 1
print 'NO. (%d/%d) test start. PID: %d ' %(counter.value, tests_count, os.getpid())
# do something below ...
if __name__ == "__main__":
pool = Pool(10)
# 80个任务,会运行run()80次,每次传入xrange数组一个元素
pool.map(run, xrange(80))
pool.close()
pool.join()
输出:
NO. (1/80) test start. PID: 23785
NO. (2/80) test start. PID: 23785
NO. (3/80) test start. PID: 23786
NO. (5/80) test start. PID: 23786
...
NO. (77/80) test start. PID: 23785
NO. (78/80) test start. PID: 23791
NO. (79/80) test start. PID: 23786
注意事项:
如果使用multiprocessing包,则要按照它的套路走,标准库threading包里面threading.Lock()、acquire()、release()这几个同步方法不生效了,因为Pool是多进程的。上面code可以直接run
本文介绍了一个使用Python的multiprocessing模块实现的并发测试脚本。该脚本通过创建一个包含10个进程的进程池来并行执行80个测试任务,并利用Lock和Value确保计数器的线程安全。每个任务开始时会打印任务编号、总任务数及进程ID。
1308

被折叠的 条评论
为什么被折叠?



