最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python之线程与进程相关介绍

    正文概述    2020-07-22   185

    Python之线程与进程相关介绍

    Python 线程与进程

    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    使用 threading 模块

    方法一:

    import threading
    import time
    def foo(n):
        print('foo %s'%n)
        time.sleep(1)
        print('end foo')
    def bar(n):
        print('bar %s'%n)
        time.sleep(2)
        print('end bar')
    t1 = threading.Thread(target=foo, args=(1,))
    t2 = threading.Thread(target=bar, args=(2,))
    t1.start()
    t2.start()
    print('........in the main..........')

    运行结果:

    foo 1
    bar 2
    ........in the main..........
    end foo
    end bar

    方法二:

    import time, threading
    class MyThread(threading.Thread):
        def __init__(self, num):
            threading.Thread.__init__(self)
            self.num = num
        def run(self):             #定义线程要运行的函数
            print("running on number:%s" % self.num)
            time.sleep(3)
    if __name__ == '__main__':
        t1 = MyThread(1)
        t2 = MyThread(2)
        t1.start()
        t2.start()

    运行结果:

    running on number:1
    running on number:2

    join 方法使得主线程等待子线程完成才继续

    import threading
    import time
    begin = time.time()
    def foo(n):
        print('foo %s'%n)
        time.sleep(1)
        print('end foo')
    def bar(n):
        print('bar %s'%n)
        time.sleep(2)
        print('end bar')
    t1 = threading.Thread(target=foo, args=(1,))
    t2 = threading.Thread(target=bar, args=(2,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print('........in the main..........')

    运行结果:

    foo 1
    bar 2
    end foo
    end bar
    ........in the main..........

    相关推荐:《Python视频教程》

    在计算密集型任务中串行与多线程进行对比

    import threading, time
    begin = time.time()
    def add(n):
        sum = 0
        for i in range(n):
            sum += i
        print(sum)
    add(100000000)
    add(200000000)
    end = time.time()
    print(end-begin)

    运行结果:

    4999999950000000
    19999999900000000
    17.66856598854065
    import threading, time
    begin = time.time()
    def add(n):
        sum = 0
        for i in range(n):
            sum += i
        print(sum)
    t1 = threading.Thread(target=add, args=(100000000,))
    t1.start()
    t2 = threading.Thread(target=add, args=(200000000,))
    t2.start()
    t1.join()
    t2.join()
    end = time.time()
    print(end-begin)

    运行结果:

    4999999950000000
    19999999900000000
    21.088160276412964
    # 结果为串行运行比多线程运行更快

    Cpython 中有 GIL (Global Interpreter Lock,全局解释器锁),所以在同一时刻,只能有一个线程进入调度。如果任务是IO密集型的,可以使用多线程;如果任务是计算密集型的,最优方法是改成 C。

    setDaemon()

    调用该方法只要是主线程完成,不管子线程是否完成都要和主线程一起退出。

    threading.currentThread()

    返回当前的线程变量。

    threading.active_count()

    返回正在运行的线程数量。

    import threading, time
    from time import ctime,sleep
    def music(func):
        print(threading.current_thread())
        for i in range(2):
            print("Begin listening to %s. %s" %(func, ctime()))
            sleep(2)
            print("end listening %s" %ctime())
    def movie(func):
        print(threading.current_thread())
        for i in range(2):
            print("Begin watching at the %s %s" %{func, ctime()})
            sleep(4)
            print("end watching %s" %ctime())
    threads = []
    t1 = threading.Thread(target=music, args=('klvchen',))
    threads.append(t1)
    t2 = threading.Thread(target=movie, args=('lili',))
    threads.append(t2)
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)
            t.start()
        print(threading.current_thread())
        print(threading.active_count())
        print("all over %s" %ctime())

    运行结果:

    <Thread(Thread-1, started daemon 5856)>
    Begin listening to klvchen. Wed Jul 11 23:43:51 2018
    <Thread(Thread-2, started daemon 9124)>
    <_MainThread(MainThread, started 9444)>
    3
    all over Wed Jul 11 23:43:51 2018

    起源地下载网 » Python之线程与进程相关介绍

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元