浅析多进程与多线程

8 篇文章 0 订阅
5 篇文章 0 订阅

join()函数在多线程任务中,join()函数的作用是让子线程结束才能继续运行。
启用多线程:import threading
threading.Threading(target=test1)
threading.Threading(target=test2)

有参数可以用args传入,语法格式如下:threading.Threading(target=test1,args=(参数1,参数2,参数3…)),args的值应为一个元组。

用队列存放多个网址给各个线程去爬取,队列的两个函数:put()和get()分别是写入数据和读取数据。

线程是否安全,针对的不是对象,而是操作,不是原子性的操作会导致线程不安全。

GIL锁是python多线程编程中的一个概念,对于单核cpu而言,某一时点只能执行一个线程的cpu操作,而且会给这个线程分配一个运行许可证,这个许可证就称为GIL锁,当线程A执行完一个cpu操作,还没来得及执行下一步操作,cpu的调度算法可能就会提前将GIL锁交给另一个线程B,从而导致数据通信混乱,线程不安全。

为了保证线程安全,最好不用再不同线程间共用数据,如果不得不修改全局变量,可以使用线程锁来保证线程安全,代码如下:
lock = threading。Lock()#创建一把线程锁
with lock #为线程加锁,强行保证了操作的原子性。但是强行阻止cpu进行线程调度会降低执行效率,甚至会导致多线程的执行时间比但线程还要久,因此在多线程任务中,尽量不要共用数据。

多线程遇到反爬:等待一段时间,使用ip代理。

对于多IO操作的任务,多线程和多进程都可以提高程序的运行效率,对于纯cpu操作型任务,多线程会失效,多进程还能发挥较大作用。

在if_name_=='main’下的代码只有在直接执行的情况下才会被执行,在import引入的情况下不会被执行,这是因为每个python代码文件都有一个内置名字_main_,而_name_是每个python代码文件的内置属性。

在使用多进程是,主模块(主进程)会被import到各子进程中,所以对创建子进程的代码段必须使用if_name_ == 'main’进行保护,否则会产生runtime error,或者导致递归创建子进程。因此,在运行多进程任务时一定要加上‘if_name_ == 'main’.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值