总结:
1 线程的并发是利用cpu上下文的切换
2 线程是最小的调度单位
3 python3是假的多线程,它不是真真正正的并行,其实就是串行,
只不过利用了cpu上下文的切换而已
4 多线程执行的顺序是无序的
5 多线程共享全局变量
6 线程是继承在进程里的,没有进程就没有线程
7 只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就很合适,计算频繁时,不要用多线程
多线程执行的顺序是无序的
-
-
import threading
-
import time
-
-
def test1(n):
-
time.sleep(1)
-
print('task-%s'%n)
-
-
for i in range(10):
-
t=threading.Thread(target=test1,args=('%s'%i,))
-
t.start()
多线程共享全局变量
-
import threading
-
g_num=0
-
def update():
-
global g_num
-
for i in range(10):
-
g_num+=1
-
def reader():
-
print(g_num)
-
t1=threading.Thread(target=update)
-
t2=threading.Thread(target=reader)
-
t1.start()
-
t2.start()
线程执行时间
-
import threading
-
import time
-
def test1(n):
-
time.sleep(1)
-
print('task-%s'%n)
-
l=[]
-
start=time.time()
-
for i in range(10):
-
t=threading.Thread(target=test1,args=(i,))
-
t.start()
-
l.append(t)
-
for j in l:
-
j.join()
-
end=time.time()
-
print('cost',(end-start))
GIL全局解释器锁
-
import threading
-
count=0
-
lock=threading.Lock()
-
def test1():
-
global count
-
lock.acquire()
-
for i in range(100000):
-
count+=1
-
lock.release()
-
def test2():
-
global count
-
lock.acquire()
-
for i in range(100000):
-
count+=1
-
lock.release()
-
t1=threading.Thread(target=test1)
-
t2=threading.Thread(target=test2)
-
t1.start()
-
t2.start()
-
t1.join()
-
t2.join()
-
print(count)
为了解决这个数据不能同步的问题,设计了gil全局解释器锁同一时间只能有一个线程使用共享数据,其它线程处于等待状态。GIL使得解释器同一时间只能运行一个线程
阅读(3895) | 评论(0) | 转发(0) |