多线程参考文档
多线程简介
跟多进程相比,多线程资源开销小。
多线程可以共享变量
跟计算相关的用多进程,io处理,爬虫请求用多线程
多线程的基本使用
import threading
import time
def sing():
for i in range(3):
print('唱歌')
time.sleep(3)
def dance():
for i in range(3):
print('跳舞')
time.sleep(3)
if __name__ == '__main__':
sing_thread = threading.Thread(target=sing)
dance_thread = threading.Thread(target=dance)
sing_thread.start()
dance_thread.start()
传参多线程
一种是按照字典的方式传参,一种是按照元组的方式传参
sing_thread = threading.Thread(target=sing,kwargs={'name':'Tom'})
sing_thread = threading.Thread(target=sing, args=(['Tom','nini']))
循环执行多个线程
for i in range(20):
dance_threading = threading.Thread(target=dance)
dance_threading.start()
多线程中分配一个线程去更换IP,并且共享存放IP的列表
list_ip = []
def api():
url = ''
response = requests.get(url).text
list_ip = response.split('\r\n')
list_ip.extend(list_ip)
print(list_ip)
if __name__ == '__main__':
dance_threading = threading.Thread(target=api)
dance_threading.start()
让一条线程先执行完,再去执行下一条线程
api_threading.start()
# 让主线程等待添加数据添加完成再去执行其他的线程
api_threading.join()
利用多线程来实现IP代理的定时更换
# -*- coding: utf-8 -*-
import threading
import time
import requests
import random
list_ip = [] #创建IP代理池存放变量
def api():
'''初始化IP代理池'''
url = 'http://http.9vps.com/getip.asp?username=13361646654&pwd=9a273e8cb06059d51dc62f3b924820d7&geshi=1&fenge=1&fengefu=&getnum=10'
response = requests.get(url).text
ret = response.split('\r\n')
list_ip.extend(ret)
def update():
'''创建一个定时更新IP代理池的方法'''
while 1:
print('沉睡十秒后再次更新IP池')
time.sleep(10)
url = 'http://http.9vps.com/getip.asp?username=13361646654&pwd=9a273e8cb06059d51dc62f3b924820d7&geshi=1&fenge=1&fengefu=&getnum=10'
response = requests.get(url).text
ret = response.split('\r\n')
list_ip.extend(ret)
def get_ip():
'''提取IP,这是运行的主线程'''
proxy = {
'http': random.choice(list_ip)
}
print('提取到的IP为')
print(proxy)
if __name__ == '__main__':
api() #先给IP池初始化
update_threading = threading.Thread(target=update)
getip_threading = threading.Thread(target=get_ip)
#先创建运行的主线程
getip_threading.start()
#再创建一个定时更新IP代理池的线程
update_threading.start()
守护线程,强退子线程
如果子线程没有执行结束,程序是不会结束的,主线程也会等待子线程运行完才会结束
这里有一个概念就是守护主线程,意思是创建子线程守护主线程,主线程退出子线程直接销毁
update_threading = threading.Thread(target=update,deamon = True)
互斥锁
对共享数据进行锁定,多个线程一起抢,同一时刻只能有一个线程可以抢到。
使用lock函数可以获得互斥锁
lock = threading.Lock()
def task1():
lock.acquire()
for i in range(20000000):
global g_num
g_num = g_num + 1
lock.release()
print('task1',g_num)
|