进程
一个程序,它是一组资源的集合
一个进程里面默认是有一个线程的,主线程
多进程是可以利用多核cpu的
线程
最小的执行单位
线程和线程之间是互相独立的
主线程等待子线程执行结束
线程和线程之间,数据是共享的。
import threading
import time
def cook():
print('做饭')
time.sleep(1)
def xiyifu():
print('洗衣服')
time.sleep(3)
def xiwan():
print('洗碗')
time.sleep(2)
start_time = time.time()
t = threading.Thread(target=cook)#线程实例化,target=函数名,默认程序自身是一个主线程t,t2,t3是三个子线程
t2 = threading.Thread(target=xiyifu)
t3 = threading.Thread(target=xiwan)
t.start()#启动线程
t2.start()
t3.start()
t.join()#主线程等待子线程结束
t2.join()
t3.join()
end_time = time.time()#end_time实际是主线程的执行时间
print(end_time - start_time)
# print(threading.active_count()) #查看当前有几个线程,threading.active_count()
守护线程:
只要主线程执行完成,不管子线程有没有执行完成,全部都结束
python的多线程是利用不了多核cpu的
import threading
import time
import random
def talk(name):
print('正在和%s聊天'%name)
time.sleep(random.randint(1,5))
print('和%s聊完了'%name)
t = threading.Thread(target=talk,args=['尹路明'])
# t.setDaemon(True) #设成守护线程
t.start()
t = threading.Thread(target=talk,args=['刘海洋'])
# t.setDaemon(True) #设成守护线程
t.start()
t = threading.Thread(target=talk,args=['方丹'])
# t.setDaemon(True) #设成守护线程
t.start()
t = threading.Thread(target=talk,args=['代爽'])
t.setDaemon(True) #设成守护线程
t.start()
print('退出qq')
导数据程序+线程传参方法
import threading
import time
import random
result_list = []
def export_data(db,excel):
print(threading.current_thread())#当前是哪个线程在运行,threading.current_thread()
print('export_data',db,excel)
time.sleep(random.randint(1,5))#随机睡1到5秒
result_list.append(random.randint(1,5))#函数有返回值,且我们想拿到返回值的方法:定义一个list,把想要的返回值加到list中,例如:random.randint(1,5)就是我们想要的返回值
thread_list = []
for i in range(10):
t = threading.Thread(target=export_data,args=['db1','测试用例.xls'])#target要执行的函数,args函数传参
thread_list.append(t)#执行的线程加到list中,能看到当前一共执行了哪些线程
t.start()
while threading.active_count() != 1:#判断当前线程数不等于1,就一直循环,一直导数据
pass
print('数据都导完了')
锁
import threading
count = 0
lock = threading.Lock()#定义锁
def add():
global count
# print(threading.current_thread(),'开始运行')#threading.current_thread(),当前运行的线程
for i in range(1000000):
#方法一:
# lock.acquire() # 加锁
# count +=1
# lock.release()#解锁
#方法二:
with lock:#with lock可以自动加锁,解锁
count+=1
for i in range(2):
t = threading.Thread(target=add)
t.start()
while threading.active_count()!=1:
pass
print(count)