一、多线程

  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. ES6躬行记(23)——Promise的静态方法和应用

    一.静态方法 Promise有四个静态方法,分别是resolve().reject().all()和race(),本节将着重分析这几个方法的功能和特点. 1)Promise.resolve() 此方法 ...

  2. 【WIP】markdown

    创建: 2018/03/18 [任务表]TODO 这个博客从来不点发布到首页, 完全100%自用, 全部详细完整的干货.千辛万苦找到这里看到一片空白, 是不是很愤怒? 那就对啦233333

  3. bzoj 303: [CQOI2009]中位数图【前缀和+瞎搞】

    处理出一个序列c,a[i]>b,c[i]=1;a[i]==b,c[i]=0;a[i]<b,c[i]=-1,然后s为c的前缀和,设w为b在a序列里的下标 注意到子序列一定横跨w,并且一个符合 ...

  4. spoj 287 NETADMIN - Smart Network Administrator【二分+最大流】

    在spoj上用题号找题就已经是手动二分了吧 把1作为汇点,k个要入网的向t连流量为1的边,因为最小颜色数等于最大边流量,所以对于题目所给出的边(u,v),连接(u,v,c),二分一个流量c,根据最大流 ...

  5. 在JS/jQuery中,怎么触发input的keypress/keydown/keyup事件?

    怎么触发keypress/keydown/keyup事件? 问题: 1.在之前的写的input后面添加了搜索按钮 2.input只有keyup事件,如下: $("#desktop_folde ...

  6. docker速记

    1.docker:一个轻量级的虚拟机.是一个容器 2.Linux系统包括—RedHat(商业版).Centos.Ubuntu 3.docker比作码头的集装箱,image镜像就是基石,images类似 ...

  7. _bzoj1002 [FJOI2007]轮状病毒【瞎搞】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1002 这种题真是有毒,很多叼一点的都用matrix tree定理推出了递推公式,也有一些用好 ...

  8. bzoj2333[SCOI2011]棘手的操作 洛谷P3273 [SCOI2011]棘手的操作

    2333? 先记一下吧,这题现在全部都是照着题解做的,因为怎么改都改不出来,只好对着题解改,以后还要再做过 以后再也不用指针了!太恶心了!空指针可不止直接特判那么简单啊,竟然还要因为空指针写奇怪的分类 ...

  9. ACM_回文素数

    回文素数 Time Limit: 2000/1000ms (Java/Others) Problem Description: 131号是一个主回文,因为它是一个素数和一个回文(当向后读时,它是相同的 ...

  10. 通过Fiddler监控Java应用发送请求及相应数据

    Fiddler可以很好的监控浏览器发送的各种请求及响应数据,对于JAVA程序默认情况下是无法监控的,但实际需求中需要监控JAVA程序发送HTTP请求及返回数据是否正确. Fiddler默认配置的监听端 ...