importthreading
importtime
#线程和进程
'''
1.线程是最小的调度单位
2.进程是最小的管理单元
3.一个进程必须至少一个线程
4.没有线程,进程也就不复存在
'''
多线程特点:
python线程特点
线程的并发是利用cpu上下文的切换(是并发,不是并行)
多线程执行的顺序是无序的
deftest1(n):
time.sleep(1)
print('task',n)
#t1=threading.Thread(target=test1,args=(1,))
#t1.start()
foriinrange(10):
t=threading.Thread(target=test1,args=('t-%s'%i,))
t.start()
多线程共享全局变量
g=0
deftest1():
globalg
foriinrange(10):
g+=1
print(g)
deftest2():
globalg
foriinrange(10):
g+=1
print(g)
t1=threading.Thread(target=test1)
t2=threading.Thread(target=test2)
t1.start()
t2.start()
线程是继承在进程里的,没有进程就没有线程
GIL全局解释器锁
lock=threading.Lock()
global_num=0
deftest1():
globalglobal_num
lock.acquire()
foriinrange(1000000):
global_num+=1
lock.release()
deftest2():
globalglobal_num
lock.acquire()
foriinrange(1000000):
global_num+=1
lock.release()
t1=threading.Thread(target=test1)
t2=threading.Thread(target=test2)
t1.start()
t2.start()
t1.join()
t2.join()
print(global_num)
在IO密集型的代码里,适合用多线程
一个程序运行起来之后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单位,不仅可以通过线程完成多任务,进程也是可以的
进程之间是相互独立的
cpu密集的时候适合用多进程
importmultiprocessing
importtime
g=0
deftest1(n):
time.sleep(50)
globalg
foriinrange(10):
g+=1
print(g)
deftest2(n):
time.sleep(50)
globalg
foriinrange(10):
g+=1
print(g)
#test1(1)
#test2(2)
if__name__=='__main__':
p1=multiprocessing.Process(target=test1,args=(1,))
p2=multiprocessing.Process(target=test2,args=(2,))
p1.start()
p2.start()
进程池
importmultiprocessing
frommultiprocessingimportPool
importtime
importthreading
g_num=0
deftest1(n):
foriinrange(n):
time.sleep(1)
print('test1',i)
deftest2(n):
foriinrange(n):
time.sleep(1)
print('test2',i)
deftest3(n):
foriinrange(n):
time.sleep(1)
print('test3',i)
deftest4(n):
foriinrange(n):
time.sleep(1)
print('test4',i)
if__name__=='__main__':
pool=Pool(1)#把进程声明出来括号里不写东西说明无限制,如果写数字,就是最大的进程数
pool.apply_async(test1,(10,))#用pool去调用函数test1,参数为10格式为(10,)
pool.apply_async(test2,(10,))#用pool去调用函数test2,参数为10格式为(10,)
pool.apply_async(test3,(10,))#用pool去调用函数test3,参数为10格式为(10,)
pool.apply_async(test4,(10,))#用pool去调用函数test4,参数为10格式为(10,)
pool.close()#close必须在join的前面
pool.join()