一、多线程

  1. Python的标准库提供了两个模块:_threadthreading_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秒但主线程没有等待就直接执行了打印了;

  2. 我们稍作改进:
    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

      主线程执行到,然后等待子线程;

  3. 上个第一次使用线程写东西的项目吧,去年刚开始写爬虫因为数量多所以网上到处找资料,东拼西凑总算给我搞出来了
    #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() # 等待线程执行结束
  4. 使用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

     

  5. 第一篇over,以后想到再加吧

python多线程和多进程(一)的更多相关文章

  1. Python多线程和多进程谁更快?

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...

  2. python多线程与多进程--存活主机ping扫描以及爬取股票价格

    python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...

  3. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  4. Python 多线程、多进程 (一)之 源码执行流程、GIL

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  5. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  6. python多线程与多进程及其区别

    个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...

  7. 基于Windows平台的Python多线程及多进程学习小结

    python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具 ...

  8. python 多线程、多进程

    一.首先说下多线程.多进程用途及异同点,另外还涉及到队列的,memcache.redis的操作等: 1.在python中,如果一个程序是IO密集的操作,使用多线程:运算密集的操作使用多进程. 但是,其 ...

  9. python多线程,多进程

    线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...

  10. 搞定python多线程和多进程

    1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发 ...

随机推荐

  1. HDU3853:LOOPS(概率DP)

    传送门 题意 从(i,j)走到(i,j),(i,j+1),(i+1,j)的概率为p[i][j][1],p[i][j][2],p[i][j][3],花费2魔力,问从(1,1)走到(r,c)的期望 分析 ...

  2. bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】

    二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...

  3. Logstash同步mysql数据库信息到ES

    @font-face{ font-family:"Times New Roman"; } @font-face{ font-family:"宋体"; } @fo ...

  4. java启动参数一

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  5. 贪心+stack Codeforces Beta Round #5 C. Longest Regular Bracket Sequence

    题目传送门 /* 题意:求最长括号匹配的长度和它的个数 贪心+stack:用栈存放最近的左括号的位置,若是有右括号匹配,则记录它们的长度,更新最大值,可以在O (n)解决 详细解释:http://bl ...

  6. Tenegrad评价函数 分类: 图像处理 Opencv 2014-11-12 20:46 488人阅读 评论(0) 收藏

    Tenegrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数. 在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值. Tenegrad函数使用Sobel算子提取水平 ...

  7. JD商家后台管理的细节

    1: 宝贝主图和滚动图都是800px,只有刚好这么多时才能得到显示,否则不会显示. 2:宝贝描述图只支持750px, 只有这么多时才能得到显示, 刚开始不知道, 上传图片上去后, 发现始终无法显示, ...

  8. 利用Marshal.AllocHGlobal申请非托管内存,unsafe代码

    unsafe public class RUN { int[] array3; IntPtr handle; ; public RUN() { handleCount = * ; handle = S ...

  9. ArrayList、HashMap 与 员工类(程序员、经理的结合使用) 相当于集合与继承的总结

    package Day28ketangzuoye; import java.util.ArrayList; import java.util.HashMap; import java.util.Map ...

  10. Java编码格式

    简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...