python多线程、多进程

进程:一个进程就是一个程序
线程:就是进程里面最小的执行单元
干活的是线程,一个进程里面有多个线程,最少有1个线程,每一个线程之间都是互相独立的
没有真正意义上的并发,电脑几核 就能一块儿运行几个程序,由于cpu处理速度快,看起来像并发的
python里面的多线程,是利用不了多核cpu的,只能利用一个核心cpu,GIL 全局解释器锁(自行百度)
有些状况下,你用多线程,比用单线程还慢
多进程,它是能够利用多核cpu的python

import threading,time
all_res = [] #定义全局变量,获取函数返回值,不能用return

def run(name):
    print('子线程',threading.current_thread())
    time.sleep(1)#等待1s
    print('【%s】haha'%name)
    name = 'hhk'+name
    all_res.append(name)
threads = []#存放全部的子线程
for i in range(5):
    t = threading.Thread(target=run,args=(str(i),)) #找线程干活 须要传参则args  元祖传参,只有一个参数后面须要有个逗号
    t.start() #开始干活
    threads.append(t)
    # t.join()#等待主进程,咱们一块儿走
print(threads)#优先打印,线程之间独立,主进程继续运行,可经过join让子线程等待主线程一块儿

也能够经过判断目前活跃线程数来判断子线程是否含在运行网络

import threading,time
all_res = [] #定义全局变量,获取函数返回值,不能用return

def run(name):
    print('子线程',threading.current_thread())
    time.sleep(1)#等待1s
    print('【%s】haha'%name)
    name = 'hhk'+name
    all_res.append(name)
threads = []#存放全部的子线程
for i in range(5):
    t = threading.Thread(target=run,args=(str(i),)) #找线程干活 须要传参则args  元祖传参,只有一个参数后面须要有个逗号
    t.start() #开始干活
    threads.append(t)
while threading.active_count()!=1:#活跃线程数不等于1,就等,直到只剩主线程
    pass
print(threads)

线程池多线程

import threadpool,pymongo,requests#第三方模块
client = pymongo.MongoClient(host='118.24.3.xx')
table = client['likun']['qq_group_likun']
all_qq = [i.get('qq') for i in table.find()]
print(all_qq)


url = "https://q4.qlogo.cn/g?b=qq&nk=%s&s=140"

def down_img(qq_num):
    res = requests.get(url%qq_num).content
    with open('%s.jpg'%qq_num, 'wb') as fw:
        fw.write(res)
pool = threadpool.ThreadPool(200)#线程池的大小
all_request = threadpool.makeRequests(down_img,all_qq)#分配数据
for a in all_request:
    pool.putRequest(a)#往线程池中加请求
# [pool.putRequest(a) for a in all_request]
pool.wait()#等待全部的线程运行完

多进程、进程池并发

#何时用多线程,什么是时候用多进程
# 多线程适用于io密集型任务
#     磁盘io,网络io
# 多进程适用于cpu密集型任务
    # 排序
from multiprocessing import Process,Pool,active_children
import pymongo,requests
client = pymongo.MongoClient(host='118.24.3.xx',port=27017)
table = client['likun']['qq_group_likun']
all_qq = [i.get('qq') for i in table.find()]

url = 'http://q4.qlogo.cn/g?b=qq&nk=%s&s=140'
def down_img(qq_num):
    res = requests.get(url%qq_num).content
    with open('%s.jpg'%qq_num,'wb') as fw:
        fw.write(res)



if __name__ == '__main__':
    # for qq in all_qq:
    #     p = Process(target=down_img,args=(qq,))#多进程
    #     p.start()
    # # print(active_children())
    #
    pool = Pool(20)#进程池大小
    list(pool.map(down_img,all_qq))#运行。使用进程池

app

import threading
from threading import Lock
num = 0
lock = Lock()#实例化一把锁,
#多个线程操做一份数据,最好加上锁

def run():
    global num
    # lock.acquire()#枷锁
    # num+=1
    # lock.release()#解锁
    while num<1000:
        with lock: #自动解锁了
            num+=1
for i in range(100):
    t = threading.Thread(target=run)
    t.start()

print(num)