#线程
#多线程:就是多个人给你干活
#多线程中,指定运行的那个函数的返回值是获取不到的
import threading,time
def a(num):
time.sleep(1)
# print(num)
for i in range(10):
t=threading.Thread(target=a,args=(i,),name='hh')
#target是要运行的函数,args是函数中要传入的参数,(传入的参数必须是元组(可迭代))如果没有参数,args可以不写,如果传入的参数是个字典就用kwargs={}
# name是设置线程的名称
# threading.current_thread().getName() 获取改该线程的名称
t.start()
# print(time.strftime("%Y%m%d%h:%M:%S"))
# print('game over')
#此时页面中有11个线程
#10 在执行a #子线程
#1 个继续往下执行代码 #主线程
#程序一运行,先有个主线程
#主线程循环创建了10个子线程,(子线程再去执行函数,但主线程创建完这10个子线程后不会等待子线程执行函数,而是直接往循环下面继续执行代码)
#主线程继续往下执行代码
urls=['www.baidu.cn']
objs=[] #存放子线程
def write_html(url,name):
import requests
r=requests.get(url)
with open(name,'w',encoding='utf-8') as fw:
fw.write(r.text)
for url in urls:
new_url='http://'+url
file_name=url+'.html'
# print(url)
# print(file_name)
t=threading.Thread(target=write_html,args=(new_url,file_name))
t.start()
# t.join() #等待(主线程遇到join等待子线程运行完,主线程再往下执行代码,此处等待会影响速度)
#将所有的子线程保存到一个list中循环list在.join()等待就不会影响运行速度
for obj in objs: #循环线程并等待,让子线程都执行完成后主线程再往下走
obj.join()
# addr('http://bbs.besttest.cn','besttest.cn.html')
#守护线程
#守护线程的意思就是主线程死l(执行完了),子线程无论是否运行完都要死(结束)
import time,threading
def test():
time.sleep(2)
print('haha')
for i in range(10):
t=threading.Thread(target=test)
t.setDaemon(True) #设置守护线程
t.start()
#锁
#锁
from threading import Lock
import threading
a=0
lock=Lock() #申请一把锁
def test():
global a
lock.acquire() #加锁
a+=1
lock.release()
#多线程处理一个任务时多次操作一个变量
for i in range(10):
t=threading.Thread(target=test)
t.start()
print(a)
#进程‘
from multiprocessing import Process
import time
def test(i):
time.sleep(2)
print(i)
if __name__=='__main__': #必须要写在这个if里面不然报错,锁、join方法都有
for i in range(10):
p=Process(target=test,args=(i,))
p.start()