Discuss / Python / 遇到个有趣的事情

遇到个有趣的事情

Topic source

Shadow_Tiy

#1 Created at ... [Delete] [Delete and Lock User]

平台:Windows 10 Python 3.7 VScode 那个多进程变量程序里在change_it(n)函数加一句打印输出当前进程信息,当前的balance,当前进程名,当前n后,balance最后并没有出错,即使是进行了10万次修改。 而且如果把print注释掉,最后的balance又会出错

Shadow_Tiy

#2 Created at ... [Delete] [Delete and Lock User]

import time,threading

money = 0

def change_it(n): global money money = money + n money = money - n print('当前进程是:%s,当前money:%s,当前n:%s' %(threading.current_thread().name,money,n))

def run_thread(n): for i in range(100000): change_it(n)

t1 = threading.Thread(target=run_thread,args=(5,),name='t1') t2 = threading.Thread(target=run_thread,args=(8,),name='t2') t1.start() t2.start() t1.join() t2.join() print(money)

我觉的这涉及到操作系统内部的调度策略了,以前用C写多线程好像也出现过类似问题

当函数本身的操作很少时,print()操作的耗时不能忽略 猜测是print()操作的耗时已经明显大于cpu调度时间片,所以不会出现对余额的临时变量错误计算 没有经过代码测试,只是因为之前写多线程任务时print()日志导致耗时上千倍增加,由此猜测

我也是这样执行结果都是0

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

那是因为print()的执行时间太长了,导致冲突的概率降了99%

所以做性能测试的时候,不能有print()语句

张-__半晕

#7 Created at ... [Delete] [Delete and Lock User]

因为多进程间信息是不共享的,所以全局变量还是全局变量的值,各自进程的变量是各自的值

DeepEndBoo

#8 Created at ... [Delete] [Delete and Lock User]

改成100万次试试


  • 1

Reply