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
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主线程执行到
,然后等待子线程; - 上个第一次使用线程写东西的项目吧,去年刚开始写爬虫因为数量多所以网上到处找资料,东拼西凑总算给我搞出来了
#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() # 等待线程执行结束 - 使用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 2018Exiting 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
- 第一篇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 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...
随机推荐
- 洛谷 P3952 时间复杂度【模拟】
把No写成NO,WA了一发-- 现在看这题也不难-- 用一个栈,记一下前面F的字母,是否合法,合法的有多长,每次入栈弹栈即可 #include<iostream> #include< ...
- bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】
注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...
- bzoj 1180: [CROATIAN2009]OTOCI【LCT】
一道几乎是板子的LCT,但是沉迷数学很久时候突然1A了这道题还是挺开心的 #include<iostream> #include<cstdio> using namespace ...
- [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- (矩阵快速幂)51NOD 1242斐波那契数列的第N项
斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, ...
- Luogu P1119 灾后重建 【floyd】By cellur925
题目传送门 这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了).只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点. (然鹅我第一次用spfa跑的时 ...
- 【SpringCloud构建微服务系列】Feign的使用详解
一.简介 在微服务中,服务消费者需要请求服务生产者的接口进行消费,可以使用SpringBoot自带的RestTemplate或者HttpClient实现,但是都过于麻烦. 这时,就可以使用Feign了 ...
- Microsoft函数调用约定
Microsoft函数调用约定 对于所有调用共有的约定:ebx.ebp.esi.edi都是calle-save,即由被调用的函数负责它们的保存(如果被调用函数用到了这些寄存器的话) 先看函数调用发生了 ...
- 455 Assign Cookies 分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 ...
- Vue.js学习笔记--1.基础HTML和JS属性的使用
整理自官网教程 -- https://cn.vuejs.org/ 1. 在HTML文件底部引入Vue <script src="https://cdn.jsdelivr.net/npm ...