博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 多线程及进程
阅读量:6331 次
发布时间:2019-06-22

本文共 3827 字,大约阅读时间需要 12 分钟。

threading使用 (工业风案例)

import threadingfrom time import sleep, ctimeloop = [4, 2]class ThreadFunc:    def __init__(self, name):        self.name = name    def loop(self, nloop, nsec):        '''        :param nloop: loop函数的名称        :param nsec: 系统休眠时间        :return:        '''        print('Start loop ', nloop, 'at ', ctime())        sleep(nsec)        print('Done loop ', nloop, ' at ', ctime())def main():    print("Starting at: ", ctime())    # ThreadFunc("loop").loop 跟一下两个式子相等:    # t = ThreadFunc("loop")    # t.loop    # 以下t1 和  t2的定义方式相等    t = ThreadFunc("loop")    t1 = threading.Thread( target = t.loop, args=("LOOP1", 4))    # 下面这种写法更西方人,工业化一点    t2 = threading.Thread( target = ThreadFunc('loop').loop, args=("LOOP2", 2))    # 常见错误写法    #t1 = threading.Thread(target=ThreadFunc('loop').loop(100,4))    #t2 = threading.Thread(target=ThreadFunc('loop').loop(100,2))    t1.start()    t2.start()    t1.join( )    t2.join()    print("ALL done at: ", ctime())if __name__ == '__main__':    main()

输出>>>

Starting at: Sun Sep 2 10:04:47 2018

Start loop LOOP1 at Sun Sep 2 10:04:47 2018
Start loop LOOP2 at Sun Sep 2 10:04:47 2018
Done loop LOOP2 at Sun Sep 2 10:04:49 2018
Done loop LOOP1 at Sun Sep 2 10:04:51 2018
ALL done at: Sun Sep 2 10:04:51 2018

分析:注意:实例化时threading.Thread(target=xxx, args=(xxx,))格式完整,工业风写法为init了的类的函数,args为其余param,一行搞定喵

  1. 可以通过设置守护线程,使不重要线程同主线程一同结束

    t1 = threading.Thread(target=fun, args=() )# 社会守护线程的方法,必须在start之前设置,否则无效t1.setDaemon(True)#t1.daemon = Truet1.start()
  2. threading.Lock()的两个线程,竞争资源都acquire(),造成无法release(),最后无法继续程序。

  3. threading.Semaphore(n)n=允许同时运行线程数

  4. threading.Timer(t, func)指定时间开始线程

多进程

  1. multiprocessing.Process()直接生成进程

  2. 创建子类生成:

    import multiprocessingfrom time import sleep, ctimeclass ClockProcess(multiprocessing.Process):    '''    两个函数比较重要    1. init构造函数    2. run    '''    def __init__(self, interval):        super().__init__()        self.interval = interval    def run(self):        while True:            print("The time is %s" % ctime())            sleep(self.interval)if __name__ == '__main__':    p = ClockProcess(3)    p.start()    while True:        print('sleeping.......')        sleep(1)

    注意:

    1. __init__里用super().__init__

    2. 重写run()

    3. 可以用os.getppid()得到父进程id,用os.getpid()得到本进程id

    4. 建立进程:

      q = multiprocessing.JoinableQueue()# 运行消费者进程cons_p = multiprocessing.Process (target = consumer, args = (q,))cons_p.daemon = Truecons_p.start()

example:

import multiprocessingfrom time import ctimedef consumer(input_q):    print("Into consumer:", ctime())    while True:        item = input_q.get()        if item is None:            break        print("pull", item, "out of q")    print("Out of consumer:", ctime())def producer(sequence, output_q):    for item in sequence:        print("Into procuder:", ctime())        output_q.put(item)        print("Out of procuder:", ctime())if __name__ == '__main__':    q = multiprocessing.Queue()    cons_p1 = multiprocessing.Process(target=consumer, args=(q,))    cons_p1.start()    cons_p2 = multiprocessing.Process (target=consumer, args=(q,))    cons_p2.start()    sequence = [1, 2, 3, 4]    producer(sequence, q)    q.put(None)    q.put(None)    cons_p1.join()    cons_p2.join()

Into procuder: Tue Sep 4 15:57:37 2018

Out of procuder: Tue Sep 4 15:57:37 2018
Into procuder: Tue Sep 4 15:57:37 2018
Out of procuder: Tue Sep 4 15:57:37 2018
Into procuder: Tue Sep 4 15:57:37 2018
Out of procuder: Tue Sep 4 15:57:37 2018
Into procuder: Tue Sep 4 15:57:37 2018
Out of procuder: Tue Sep 4 15:57:37 2018
Into consumer: Tue Sep 4 15:57:37 2018
pull 1 out of q
pull 2 out of q
pull 3 out of q
pull 4 out of q
Out of consumer: Tue Sep 4 15:57:37 2018
Into consumer: Tue Sep 4 15:57:37 2018
Out of consumer: Tue Sep 4 15:57:37 2018

分析:

  1. multiprocessing.Queue()建立一个进程间队列
  2. Queue.put()以及Queue.get()为队列操作,先进先出

转载于:https://www.cnblogs.com/TuerLueur/p/9585408.html

你可能感兴趣的文章
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
Can't connect to MySQL server on 'localhost'
查看>>
【Magedu】Week01
查看>>
写给MongoDB开发者的50条建议Tip25
查看>>
PostgreSQL学习手册(四) 常用数据类型
查看>>
为什么要让带宽制约云计算发展
查看>>
[iOS Animation]-CALayer 绘图效率
查看>>
2012-8-5
查看>>
VS中ProjectDir的值以及$(ProjectDir)../的含义
查看>>
我的友情链接
查看>>
PHP实现排序算法
查看>>
Business Contact Mnanager for Outlook2010
查看>>
9种用户体验设计的状态是必须知道的(五)
查看>>
解决WIN7下组播问题
查看>>
陈松松:视频营销成交率低,这三个因素没到位
查看>>
vmware nat模式原理探究,实现虚拟机跨网段管理
查看>>
JavaSE 学习参考:集合运算
查看>>
CSS属性:font-family
查看>>