python多线程和多进程(一)
一、多线程
- Python的标准库提供了两个模块:
_thread
和threading
,_thread
是低级模块,threading
是高级模块,对_thread
进行了封装。绝大多数情况下,只需要使用threading
这个模块。- import threading
- from time import ctime,sleep
- def func1(func):
- print u" 我是函数%s.此刻打印时间: %s" %(func,ctime())
- sleep(5)
- print u'%s再次打印时间%s' % (func,ctime())
- def func2(func):
- print u"我是函数 %s此刻打印时间: %s" %(func,ctime())
- sleep(5)
- print u'%s再次打印时间%s'%(func,ctime())
threads = []- t1 = threading.Thread(target=func1,args=('func1',)) #创建线程,args传参必须以元组方式传入
- threads.append(t1)
- t2 = threading.Thread(target=func2,args=('func2',))#创建线程,args传参必须以元组方式传入
threads.append(t2)
if __name__ == '__main__':
for t in threads:
# t.setDaemon(True) #设置守护线程(主线程退出,子线程也会退出,不会挂起占用资源)
t.start() #启动线程
print u'脚本结束时间%s'%ctime()
运行结果:(注意setDaemon())
- 我是函数func1.此刻打印时间: Fri Sep 07 15:43:15 2018
- 我是函数 func2此刻打印时间: Fri Sep 07 15:43:15 2018
- 脚本结束时间Fri Sep 07 15:43:15 2018 #(三个都是同一时间打印)
- func1再次打印时间Fri Sep 07 15:43:20 2018
- func2再次打印时间Fri Sep 07 15:43:20 2018 #(两个都为等待5秒后同事打印)
说明;func1,func2都是同时一时间执行任务了,但是为什么脚本结束时间先打印了,原因是主线程被分成两个子线程同时运行,但是子线程有等待5秒但主线程没有等待就直接执行了打印了;
- import threading
- 我们稍作改进:
- import threading
- from time import ctime,sleep
- def func1(func):
- print u" 我是函数%s.此刻打印时间: %s" %(func,ctime())
- sleep(5)
- print u'%s再次打印时间%s' % (func,ctime())
- def func2(func):
- print u"我是函数 %s此刻打印时间: %s" %(func,ctime())
- sleep(5)
- print u'%s再次打印时间%s'%(func,ctime())
- threads = []
- t1 = threading.Thread(target=func1,args=('func1',))
- threads.append(t1)
- t2 = threading.Thread(target=func2,args=('func2',))
- threads.append(t2)
- if __name__ == '__main__':
- for t in threads:
- # t.setDaemon(True) #设置守护线程(主线程退出,子线程也会退出,不会挂起占用资源)
- t.start()
- for t in threads:
t.join() # 等待线程执行结束
print u'脚本结束时间%s'%ctime()
- 我是函数func1.此刻打印时间: Fri Sep 07 16:09:29 2018
- 我是函数 func2此刻打印时间: Fri Sep 07 16:09:29 2018
- func1再次打印时间Fri Sep 07 16:09:34 2018
- func2再次打印时间Fri Sep 07 16:09:34 2018
- 脚本结束时间Fri Sep 07 16:09:34 2018
主线程执行到
,然后等待子线程;
- import threading
- 上个第一次使用线程写东西的项目吧,去年刚开始写爬虫因为数量多所以网上到处找资料,东拼西凑总算给我搞出来了
- #encoding:utf-8
- import requests
- import threading
- from lxml import etree
- import codecs,csv
- def return_link():
- Link = []
- for i in range(2000):
- url="http://www.xzgsj.gov.cn/baweb/show/shiju/gg.jsp?fenceid=95000000&total=45192&queryType=6&pagenum="+str(i)+"&action=gg.jsp?ssid=ZxSlh1DBkGGpV2hnWMSt5PG7f8FPjTbvH78vJ1nFcwYyMhWzGBzy!1470507879!1500631589968&findWenhao=&findName="
- Link.append(url)
- return Link
- def get_href():
- while True:
- lock.acquire()
- if len(Link) == 0:
- lock.release()
- break
- else:
- url = Link.pop(0)
- lock.release()
- r = requests.get(url, headers=headers).content
- print url
- pages = etree.HTML(r.decode('utf-8'))
- a = pages.xpath(u"//table[@width='700']/tr[position()>1]/td/a/@onclick")
- for i in a:
- a = i.replace('javaScript:window.open(\'', '').replace('\',\'a\',\'width=550 height=350\')', '')
- url = 'http://www.xzgsj.gov.cn/baweb/show/shiju/' + a
- with codecs.open('url.csv','ab') as f:
- w = csv.writer(f)
- w.writerow([url])
- if __name__ == '__main__':
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
- }
- lock = threading.Lock()#线程锁
- Link = return_link()
- tasks = [] # 任务列表
- for x in range(5):
- t = threading.Thread(target=get_href) # 准备线程函数及参数
- t.setDaemon(True) # 设置守护线程(主线程退出,子线程也会退出,不会挂起占用资源)
- tasks.append(t)
- for t in tasks:
- t.start() # 启动多线程(任务列表有多少个值,就会启动多少个线程)
- for t in tasks:
- t.join() # 等待线程执行结束
- #encoding:utf-8
- 使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法:(和第一个例子一样只是基于类的使用)
- import threading
- from time import ctime,sleep
- class myThread(threading.Thread): # 继承父类threading.Thread
- def __init__(self, threadID, name, counter):
- threading.Thread.__init__(self)
- self.threadID = threadID
- self.name = name
- self.counter = counter
- def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
- print "Starting " + self.name,u'时间{}'.format(ctime())
- sleep(5)
- print "Exiting " + self.name,u'时间{}'.format(ctime())
- # 创建新线程
- thread1 = myThread(1, "Thread-1", 1)
- thread2 = myThread(2, "Thread-2", 2)
- # 开启线程
- tasks = []
- tasks.append(thread1)
- tasks.append(thread2)
- if __name__ == '__main__':
- for t in tasks:
- # t.setDaemon(True) #设置守护线程(主线程退出,子线程也会退出,不会挂起占用资源)
- t.start()
- for t in tasks:
- t.join() # 等待线程执行结束
- print u'脚本结束时间%s'%ctime()
结果:
- Starting Thread-1 时间Fri Sep 07 17:13:53 2018
- Starting Thread-2 时间Fri Sep 07 17:13:53 2018
- Exiting Thread-1 时间Fri Sep 07 17:13:58 2018
Exiting Thread-2 时间Fri Sep 07 17:13:58 2018
- 脚本结束时间Fri Sep 07 17:13:58 201
- import threading
- 第一篇over,以后想到再加吧
python多线程和多进程(一)的更多相关文章
- Python多线程和多进程谁更快?
python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...
- python多线程与多进程--存活主机ping扫描以及爬取股票价格
python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- Python 多线程、多进程 (一)之 源码执行流程、GIL
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- Python 多线程、多进程 (二)之 多线程、同步、通信
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- python多线程与多进程及其区别
个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...
- 基于Windows平台的Python多线程及多进程学习小结
python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具 ...
- python 多线程、多进程
一.首先说下多线程.多进程用途及异同点,另外还涉及到队列的,memcache.redis的操作等: 1.在python中,如果一个程序是IO密集的操作,使用多线程:运算密集的操作使用多进程. 但是,其 ...
- python多线程,多进程
线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...
- 搞定python多线程和多进程
1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...
随机推荐
- MySQL基础 -- 关系代数
MySQL基础 -- 关系代数 关系代数是一种抽象的查询语言,它用对关系的运算来表达查询. 任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的结果.所以运算对象.运算符.运算结果是运算 ...
- Linux之旅第一篇-目录结构及操作目录
一.引言 Linux对java开发来说也是一项必备的技能,因为项目基本都是部署在Linux操作系统的服务器中,虽然项目不一定需要我们去部署,但不管是自己测试环境部署,还是一些生产环境中日志的查看,Li ...
- Logstash读取文本信息并写入到ES
Logstash读取文本信息并写入到ES 前提是ELK安装没问题 进入到logstash安装目录下的bin目录(我的logstash安装目录:/usr/local/) [root@es1 bin]# ...
- pytest单侧模块_入门汇总
Pytest简单介绍 (pytest是python的一个测试框架,主要是用来进行一些小的测试) 安装:pip install -U pytest 查看是否安装成功:pytest --version 运 ...
- 博弈 HDOJ 4371 Alice and Bob
题目传送门 题意:Alice和 Bob轮流写数字,假设第 i 次的数字是S[i] ,那么第 i+1 次的数字 S[i+1] = S[i] + d[k] 或 S[i] - d[k],条件是 S[i+1] ...
- 求N!尾数有多少个0。
方法一:假设N!=K*10M,K不能被10整除,那么N!尾数就有M个0.再对N!进行质因子分解:N!=2x*3y*5z...由于10=2*5,即每一对2和5相乘都可以得到1个0,所以M只与指数x.z有 ...
- post和get提交服务器编码过程
参考资料:http://blog.csdn.net/z55887/article/details/46975679 先说出一个知识点: 如果浏览器端编码是UTF-8,那在服务器端解决乱码问题的方法有两 ...
- SharePoint2013升级SP1后,运行配置向导报错:未注册sharepoint服务
SharePoint Server 2013 升级SP1后,需要重新运行配置向导,但是运行过程中报错:未注册sharepoint服务. 日志详细错误信息: 已引发类型为 Microsoft.Share ...
- WebForm 开发方式,简单使用
ASP开发方式 格式 <% %> C#代码可以写在里面 <%= %> 往外输出一个值,可以放一个变量,一个方法(这个方法是有返回值的直接打印到界面上去) <%@ %& ...
- echart动态加载数据
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>EChar ...