zoukankan      html  css  js  c++  java
  • 18 python --多线程

    Python中提供了threading模块来对多线程的操作,
    1. 多线程实例
    线程是应用程序中工作的最小单元。

    多线程是现实有两种方式:
    方法一:将要执行的方法作为参数传给Thread的构造方法(和多进程类似)
    t = threading.Thread(target=action, args=(i,))

    方法二:从Thread继承,并重写run()
    看源码:
    P = threading.Thread
    p.start() _start_new_thread(self.__bootstrap, ())  self.__bootstrap_inner()  
    self.run()
    try:
    if self.__target:
    self.__target(*self.__args, **self.__kwargs)
    所以如果重写了run,就直接调用run的函数了,如果run没有重新,就调用target函数。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # @File    : demon1.py
    import threading
    
    
    def worker(n):
        print("start worker{0}".format(n))
    
    
    class MyThread(threading.Thread):
        def __init__(self, args):
            super(MyThread, self).__init__()
            self.args = args
        def run(self):
            print("start MyThread{0}".format(self.args))
    
    if __name__ == "__main__":
        for i in xrange(1, 6):
            t1 = threading.Thread(target=worker, args=(i,))
            t1.start()
        t1.join()
    
        for x in xrange(6, 11):
            t2 = MyThread(x)
            t2.start()
        t2.join()
    View Code


    2. 线程锁
    通过threading.Lock()来创建锁,函数在执行的只有先要获得锁,左后执行完以后要释放锁:
    with lock:
    lock.acquire()
    lock.release()
    实例:
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import threading
    import time
    def worker(name, lock):
        with lock:
            print("start {0}".format(name))
            time.sleep(5)
            print("end {0}".format(name))
    if __name__ == "__main__":
        lock = threading.Lock()
        t1 = threading.Thread(target=worker, args=("worker1", lock))
        t2 = threading.Thread(target=worker, args=("worker2", lock))
        t1.start()
        t2.start()

    import threading
    import time
    
    
    def worker(name, lock):
        with lock:
            print("start {0}".format(name))
            time.sleep(5)
            print("end {0}".format(name))
    
    # with lock:
    # lock.acquire()
    # lock.release()
    
    if __name__ == "__main__":
        lock = threading.Lock()
        t1 = threading.Thread(target=worker, args=("worker1", lock))
        t2 = threading.Thread(target=worker, args=("worker2", lock))
        t1.start()
        t2.start()
        print("main end.")
    View Code

    3. 线程共享变量
    多线程和多进程不同之处在于多线程本身就是可以和父进程共享内存的,这也是为什么其中一个线程挂掉以后,为什么其他线程也会死掉的道理。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import threading
    l = list()
    l += range(1, 10)
    def worker():
        l.append("ling")
        l.append("shang")
        l.append("hello")
    if __name__ == "__main__":
        t = threading.Thread(target=worker)
        t.start()
        print(l)

    import threading
    
    
    def worker(l):
        l.append("ling")
        l.append("huo")
        l.append("wang")
    
    if __name__ == "__main__":
        l = list()
        l += range(1, 10)
        print(l)
        t = threading.Thread(target=worker, args=(l,))
        t.start()
        print(l)
    View Code

    4. 线程池
    通过传入一个参数组来实现多线程,并且它的多线程是有序的,顺序与参数组中的参数顺序保持一致。
    安装包:
    pip install threadpool

    调用格式:
    from threadpool import *
    pool = ThreadPool(poolsize)
    requests = makeRequests(some_callable, list_of_args, callback)
    [pool.putRequest(req) for req in requests]
    pool.wait()

    import threadpool
    
    
    def hello(m, n, o):
        """"""
        print "m = %s, n = %s, o = %s" % (m, n, o)
    
    
    if __name__ == '__main__':
        # 方法1
        lst_vars_1 = ['1', '2', '3']
        lst_vars_2 = ['4', '5', '6']
        func_var = [(lst_vars_1, None), (lst_vars_2, None)]
        # 方法2
        dict_vars_1 = {'m': '1', 'n': '2', 'o': '3'}
        dict_vars_2 = {'m': '4', 'n': '5', 'o': '6'}
        func_var = [(None, dict_vars_1), (None, dict_vars_2)]
    
        pool = threadpool.ThreadPool(2)
        requests = threadpool.makeRequests(hello, func_var)
        [pool.putRequest(req) for req in requests]
        pool.wait()
    View Code
  • 相关阅读:
    8月3日云栖精选夜读:LSF-SCNN:一种基于CNN的短文本表达模型及相似度计算的全新优化模型
    linux(centos)下安装PHP的PDO扩展
    Linux中find常见用法示例
    01 编译原理概述
    20145221 《信息安全系统设计基础》第5周学习总结
    20145221 《信息安全系统设计基础》第4周学习总结
    爱春秋之戏说春秋 Writeup
    20145221 《信息安全系统设计基础》第3周学习总结
    20145221 《信息安全系统设计基础》第2周学习总结
    20145221 《信息安全系统设计基础》第1周学习总结
  • 原文地址:https://www.cnblogs.com/the-way-to-bifk/p/8039994.html
Copyright © 2011-2022 走看看