zoukankan      html  css  js  c++  java
  • python核心编程笔记4多线程

    单线程程序:

    import time
    def Sorry():
        print "I'm sorry!"    time.sleep(1)
    if __name__=='__main__':
        for i in range(5):
            Sorry()

    添加线程

    
    
    import threading

    def thread_job():
    print 'this is an added Thread,number is %s' % threading.current_thread()

    if __name__ == '__main__':
    added_thread = threading.Thread(target=thread_job)
    added_thread.start()

    join 等待线程结束之后再往下执行

    import time,threading
    def thread_job():
        print 'T1 start\n'
        for i in range(10):
            time.sleep(0.1)
        print 'T1 finish\n'
    
    def mian():
        added_thread = threading.Thread(target=thread_job,name='T1')
        added_thread.start()
        print 'all done\n'
    if __name__ == '__main__':
        mian()
    import time,threading
    def thread_job():
        print 'T1 start\n'
        for i in range(10):
            time.sleep(0.1)
        print 'T1 finish\n'
    
    def mian():
        added_thread = threading.Thread(target=thread_job,name='T1')
        added_thread.start()
        added_thread.join()
        print 'all done\n'
    if __name__ == '__main__':
        mian()

    Queue功能,因为线程中不能使用return

    import time,threading
    from queue import Queue
    def job(l,q):
        for i in range(len(l)):
            l[i] = l[i]**2
        q.put(l)
    def multithreading():
        q = Queue()
        threads = []
        data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
        for i in range(4):
            t = threading.Thread(target=job,args=(data[i],q))
            t.start()
            threads.append(t)
        for thread in threads:
            thread.join()
        results = []
        for _ in range(4):
            results.append(q.get())
        print results
    if __name__ == '__main__':
        multithreading()

    lock锁

    import threading
    def job1():
        global A
        for i in range(10):
            A += 1
            print 'job1 %d' % A
    def job2():
        global A
        for i in range(10):
            A += 10
            print 'job2 %d' % A
    
    if __name__ == '__main__':
        A = 0
        t1 = threading.Thread(target=job1)
        t2 = threading.Thread(target=job2)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
    import threading
    def job1():
        global A,lock
        lock.acquire()
        for i in range(10):
            A += 1
            print 'job1 %d' % A
        lock.release()
    def job2():
        global A,lock
        lock.acquire()
        for i in range(10):
            A += 10
            print 'job2 %d' % A
        lock.release()
    
    if __name__ == '__main__':
        lock = threading.Lock()
        A = 0
        t1 = threading.Thread(target=job1)
        t2 = threading.Thread(target=job2)
        t1.start()
        t2.start()
        t1.join()
        t2.join()

    ps:多线程不一定有效率,有GIL锁的存在,python只能同一时间让一个线程运算同一个运算

    import threading
    from queue import Queue
    import copy
    import time
    
    def job(l, q):
        res = sum(l)
        q.put(res)
    
    def multithreading(l):
        q = Queue()
        threads = []
        for i in range(4):
            t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
            t.start()
            threads.append(t)
        [t.join() for t in threads]
        total = 0
        for _ in range(4):
            total += q.get()
        print(total)
    
    def normal(l):
        total = sum(l)
        print(total)
    
    if __name__ == '__main__':
        l = list(range(1000000))
        s_t = time.time()
        normal(l*4)
        print('normal: ',time.time()-s_t)
        s_t = time.time()
        multithreading(l)
        print('multithreading: ', time.time()-s_t)

  • 相关阅读:
    查询避免Unknown column ‘xxx’ in ‘where clause
    Spring依赖循环:The dependencies of some of the beans in the application context form a cycle
    POJ(北京大学)刷题导航
    ACM使用Java提交总是超时的解决方法
    申请了服务器,建立了新博客。 不在用这个了。
    jeecg数据库添加字段后表单的修改
    jeecg普通表和数据字典的关联
    jeecg添加滚动图
    jeecg定时任务的bug记录
    classpath究竟是指哪里?
  • 原文地址:https://www.cnblogs.com/mohu/p/8889665.html
Copyright © 2011-2022 走看看