【求助,疑问】比较单线程与多线程操作的用时
Topic source刚才我发的用的是一个网友的方法,即在change_it函数里面加锁,单线程用时1s多,双线程用时2s多,现在我用廖老师的方法来写比较用时函数,即在run_thread函数里面加锁,单线程用时0.1s多,双线程用时0.2s多......为什么同样是加锁,加锁的地方不一样,程序跑的时间会相差10倍之多??
import time, threading
print('本程序将进行比较,单线程和多线程的用时')
balance=0
lock = threading.Lock()
def change_it(n):
global balance
balance = balance + n
balance = balance - n
def run_thread1(n):
for i in range(200000):
lock.acquire()
try:
change_it(n)
finally:
lock.release()
def run_thread2(n):
for i in range(100000):
lock.acquire()
try:
change_it(n)
finally:
lock.release()
balance=0
start1 = time.time()
td = threading.Thread(target=run_thread1, args=(5,))
td.start()
td.join()
end1 = time.time()
timeuse1=end1-start1
print('\nbalance最终结果:%d 单线程用时:%f 秒'%(balance,timeuse1))
balance=0
start2 = time.time()
t1 = threading.Thread(target=run_thread2, args=(5,))
t2 = threading.Thread(target=run_thread2, args=(5,))
t1.start()
t2.start()
t1.join()
t2.join()
end2 = time.time()
timeuse2=end2-start2
print('\nbalance最终结果:%d 多线程用时:%f 秒'%(balance,timeuse2))
你的两个程序,一个循环100万次,一个循环10万次,当然时间差了10倍。 至于双线程执行是单线程差不多2倍,我在自己机器测试了一下,不是2倍,下面是结果: 本程序将进行比较,单线程和多线程的用时
balance最终结果:0 单线程用时:0.095876 秒
balance最终结果:0 多线程用时:0.099555 秒
结果显示,多线程由于要进行锁的等待,所以用时稍微多一些。
我运行最上面第一个的结果(两次运行):
本程序将进行比较,单线程和多线程的用时
balance最终结果:0 单线程用时:2.388602 秒
balance最终结果:0 多线程用时:3.130102 秒
本程序将进行比较,单线程和多线程的用时
balance最终结果:0 单线程用时:2.470650 秒
balance最终结果:0 多线程用时:3.081061 秒
运行最下面的程序结果(把那个循环数目都加了一个零,确保次数和前面相同):
本程序将进行比较,单线程和多线程的用时
balance最终结果:0 单线程用时:2.442637 秒
balance最终结果:0 多线程用时:2.881924 秒 本程序将进行比较,单线程和多线程的用时
balance最终结果:0 单线程用时:1.692133 秒
balance最终结果:0 多线程用时:2.622757 秒
总的来说,多线程勇士确实比单线程用时多(这是在有加锁的情况下),如果单线程不加锁的话运行时间会更快!
- 1
早起的达先生
根据上文所讲,上了锁之后,多线程中一个线程执行完后才进行下一个线程,因此我猜想其效率应该和上了锁的单线程是一样的吧,因此我编写了如下程序,单线程实现存取2000000次,多线程(2线程)各实现存取1000000次,这样从工作量来讲,应该是一样的,在命令行模式下运行发现每次操作多线程都比单线程用时多1倍左右,请问这是为什么?
问题2: 如果我编写了如下程序,算不算单线程?
下面的用时比上面的单线程和多线程更少,比上面的单线程又少了一倍,那多线程的效率到底体现在哪里?