一、多线程

  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. Swift4 扩张(Extenstion), 集合(Set)

    创建: 2018/03/09 完成: 2018/03/10 更新: 2018/04/19 修改小标题  [扩张的定义与使用协议] -> [通过扩张来采用协议] 更新: 2018/09/18 标题 ...

  2. python之logging模块简单用法

    前言: python引入logging模块,用来记录自己想要的信息.print也可以输入日志,但是logging相对print来说更好控制输出在哪个地方.怎么输出以及控制消息级别来过滤掉那些不需要的信 ...

  3. Java-String 类的常用方法

    Java 中 String 类的常用方法 Ⅰ String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等,下面我们就来领略它的强大之 ...

  4. ACM数论-求组合数

    我们利用这个公式求阶乘和逆元求阶: #include<cstdio> const int N = 200000 + 5; const int MOD = (int)1e9 + 7; int ...

  5. Data Center Maintenance CodeForces - 950E

    http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #inc ...

  6. 使用Apache Commons IO组件读取大文件

    Apache Commons IO读取文件代码如下: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new ...

  7. Hanlder + 弱引用防内存漏泄示例*

    Hanlder + 弱引用防内存漏泄示例: public class MainActivity extends AppCompatActivity { public final MyHandler h ...

  8. java 字符串的比较compareTo

    import java.util.Scanner; public class Demo01 { public static void main(String[] args) {     Scanner ...

  9. windows deintall 12c client

    1.unintall: close all oracle app C:\app\client\CICadmin\product\12.1.0\client_1\deinstall deinstall ...

  10. mysql配置mha高可用防火墙未关闭报错

    ########################################################################## l  问题背景:检查主从复制之后做高可用报错 [r ...