一、多线程

  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. E20180224-hm-xa

    separator n. 分离器,分离装置; 防胀器; colon n. 冒号; <解>结肠; 科郎(哥斯达黎加货币单位); semicolon  n. 分号;

  2. 5 分钟掌握 JS 实用窍门技巧,帮你快速撸码--- 删除数组尾部元素、E6对象解构、async/await、 操作平铺嵌套多维数组等

    1. 删除数组尾部元素 一个简单方法就是改变数组的length值: const arr = [11, 22, 33, 44, 55, 66]; arr.length = 3; console.log( ...

  3. Linux环境下ZooKeeper集群环境搭建关键步骤

    ZooKeeper版本:zookeeper-3.4.9 ZooKeeper节点:3个节点 以下为Linux环境下ZooKeeper集群环境搭建关键步骤: 前提条件:已完成在Linux环境中安装JDK并 ...

  4. Saas物联网共享平台实战

    什么是SaaS系统: 越来越多的软件,开始采用云服务. 云服务只是一个统称,可以分成三大类. IaaS:基础设施服务,Infrastructure-as-a-service PaaS:平台服务,Pla ...

  5. 数组声明的几种方式以及length属性

    声明一: int[] arr=new int[10]; for(int i=0;i<arr.length;i++){ arr[i]=i; } 声明二: int[] arr2={1,2,3}; 声 ...

  6. Codeforces Round #230 (Div. 1)

    A: 题意:给你一个半径为n的圆 求最少阻塞多少个点 才能使所以圆内及圆上的点 都不与外边的点相连  相连是距离为1 只算整数点 这题定住x,y依次递减 判断一下是否4-connect 这个意思就是 ...

  7. android开发学习--网络请求框架RxJava+Retrofit

    看了好多的博客,终于弄清楚了Rxjava和Retrofit,给大家推荐几个不错的文章: https://gank.io/post/56e80c2c677659311bed9841 这个文章是只用Ret ...

  8. SpringBoot_自定义配置属性

    @ConfigurationProperties 在aplication.properties 中添加如下一段配置: mysql.jdbcName=com.mysql.jdbc.Driver mysq ...

  9. dubbo系列--集群容错

    作为一个程序员,咱们在开发的时候不仅仅是完成某个功能,更要考虑其异常情况程序如何设计,比如说:dubbo的消费端调用服务方异常的情况,要不要处理?如何处理? dubbo提供了多种集群容错机制,默认是f ...

  10. 移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

    前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传. 这个功能模块主要有这5点比较 ...