多线程的使用:
- import threading
- def func(x):
- print(x)
- t= threading.Thread(target=func,args=(12,))
- # 线程启动
- t.start()
- # 主进程阻塞, 等待子进程的退出
- t.join()
- # 设置线程为主线程的守护线程
- t.setDaemon()
多进程的使用
- from multiprocessing import Process
- def func(x):
- print(x)
- p = Process(target=func,args=(12,))
- p.start()# 启动子进程实例 (创建子进程)
- p.is_alive()# 判断进程子进程是否还在活着
- p.join(timeout)# 是否等待子进程执行结束, 或者等待多少秒
- p.terminate()# 不管任务是否完成, 立即终止子进程
- p.daemon = True # 设置守护进程
线程池, 进程池的使用:
- # 进程池
- from multiprocessing import Pool
- # 线程池
- from multiprocessing.dummy import Pool
- pool = Pool(5) # 同时最大运行线程或者进程个数
- def _excute(x,y):
- print(x+y)
- def _callback(self, temp): # temp 必有参数
- print("线程或进程任务完成后的回调")
- pool.apply_async(target=_excute, callback=_callback)
- poll.close()# 关闭 Pool, 使其不再接受新的任务;
- poll.terminate()# 不管任务是否完成, 立即终止;
- poll.join()# 主进程阻塞, 等待子进程的退出, 必须在 close 或 terminate 之后使用
进程或者线程的间通信工具 --Queue
- # 线程池, 多线程 使用的 Queue
- from queue import Queue
- # 多进程使用的 queue
- from multiprocessing import JoinableQueue as Queue
- # 进程池使用的 queue
- from multiprocessing import Manager
- queue = Manager().Queue()
- queue = Queue()
- queue.qsize()# 返回当前队列包含的消息数量.
- queue.empty()# 如果队列为空, 返回 True, 反之 False.
- queue.full()# 如果队列满了, 返回 True, 反之 False.
- queue.put(item, block=True, timeout=None)
将 item 消息写入队列, block 默认值为 True;
如果 block 使用默认值, 且没有设置 timeout(单位秒), 消息列队如果已经没有空间可写入, 此时程序将被阻塞 (停
在写入状态), 直到从消息列队腾出空间为止, 如果设置了 timeout, 则会等待 timeout 秒, 若还没空间, 则抛
出 "Queue.Full" 异常;
如果 block 值为 False, 消息列队如果没有空间可写入, 则会立刻抛出 "Queue.Full" 异常;
queue.get(item, block=True, timeout=None)
获取队列中的一条消息, 然后将其从队列中移除, block 默认值为 True. 如果 block 使用默认值, 且没有设置
timeout(单位秒), 消息列队如果为空, 此时程序将被阻塞 (停在读取状态), 直到从消息列队读到消息为止, 如果
设置了 timeout, 则会等待 timeout 秒, 若还没读取到任何消息, 则抛出 "Queue.Empty" 异常;
如果 block 值为 False, 消息列队如果为空, 则会立刻抛出 "Queue.Empty" 异常;
- # get 方法并不能让 queue 的计数 - 1, 必须调用 task_done
- queue.task_done()
来源: https://www.cnblogs.com/skaarl/p/9665606.html