线程同步:使用join,其实只有一个线程执行
udp端口占用有个立即释放 udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,True)
os模块除了文件夹操作还有什么,好像没有了暂时没看到
线程共享全局变量,进程不共享全局变量,进程实际是在自己本身中拷贝了一个全局变量,自己做更改 所有线程有个Lock,进程没有Lock互相不影响
线程守护主线程 子线程.setDaemon(True) 进程守护主进程 子进程.daemon=True 格式不同
线程,进程,协程在不考虑cpu核数的情况下,具体是一起执行还是交替执行这个问题很重要,区分清
线程 单核情况下,实际是一个线程执行完,再执行下一个线程,不是打折骨头连着筋的
进程 和线程相同 pool的异步不相同
协程 单线程,多任务交替执行
进程最大,进程执行其实是其中的线程执行,然后可以在要求单线程的情况下,使用协程,所以协程最小
进程的格式:和线程相同
进程其实通俗说成,两个程序启动运行就是走两条进程,所以进程之间相互有通信 使用Queue搬运 (udp/tcp使用socket搬运)
Queue 消息队列
queue(变量) = multiprocessing.Queue(5) 消息队列的个数限制,5表示队列最多一次储存5个就满了,是个参数
放入 queue.put(参数)
取出 queue.get()
判断 满了 queue.full()
空 queue.empty() 这个empty是个坑,不建议使用
个数 queue.qsize()
Pool进程池
pool = multiprocessing.Pool(3) 3:进程池中有3条进程,运行程序始终只使用这3条进程
想想是不是把进程池的运行放到循环里(for)看以后遇到多少吧
同步执行进程 pool.apply(函数名)
异步执行进程 pool.apply_async(函数名) 应该是实现三条进程同时走(用os.getpid()检验)
进程池需要关闭 pool.close()
主进程的等待放最后 (关闭了pool主进程才知道子进程run完了) pool.join()
Pool中的Queue创建方法有一点区别 queue = multiprocessing.Manager().Queue() 加个Manager表示是进程池中的Queue
小点:
multiprocessing.current_process 当前的进程
还记得命令里的pid吗,kill -9 pid那个,就是进程号
os模块除了文件夹使用,现在还有进程这, os模块的方法 os.getpid() 获取进程号 os.get.ppid() 获取父进程号
子进程.terminate()终止进程
udp端口占用有个立即释放 udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEPORT,True)
os模块除了文件夹操作还有什么,好像没有了暂时没看到
线程共享全局变量,进程不共享全局变量,进程实际是在自己本身中拷贝了一个全局变量,自己做更改 所有线程有个Lock,进程没有Lock互相不影响
线程守护主线程 子线程.setDaemon(True) 进程守护主进程 子进程.daemon=True 格式不同
线程,进程,协程在不考虑cpu核数的情况下,具体是一起执行还是交替执行这个问题很重要,区分清
线程 单核情况下,实际是一个线程执行完,再执行下一个线程,不是打折骨头连着筋的
进程 和线程相同 pool的异步不相同
协程 单线程,多任务交替执行
进程最大,进程执行其实是其中的线程执行,然后可以在要求单线程的情况下,使用协程,所以协程最小
进程的格式:和线程相同
进程其实通俗说成,两个程序启动运行就是走两条进程,所以进程之间相互有通信 使用Queue搬运 (udp/tcp使用socket搬运)
Queue 消息队列
queue(变量) = multiprocessing.Queue(5) 消息队列的个数限制,5表示队列最多一次储存5个就满了,是个参数
放入 queue.put(参数)
取出 queue.get()
判断 满了 queue.full()
空 queue.empty() 这个empty是个坑,不建议使用
个数 queue.qsize()
Pool进程池
pool = multiprocessing.Pool(3) 3:进程池中有3条进程,运行程序始终只使用这3条进程
想想是不是把进程池的运行放到循环里(for)看以后遇到多少吧
同步执行进程 pool.apply(函数名)
异步执行进程 pool.apply_async(函数名) 应该是实现三条进程同时走(用os.getpid()检验)
进程池需要关闭 pool.close()
主进程的等待放最后 (关闭了pool主进程才知道子进程run完了) pool.join()
Pool中的Queue创建方法有一点区别 queue = multiprocessing.Manager().Queue() 加个Manager表示是进程池中的Queue
小点:
multiprocessing.current_process 当前的进程
还记得命令里的pid吗,kill -9 pid那个,就是进程号
os模块除了文件夹使用,现在还有进程这, os模块的方法 os.getpid() 获取进程号 os.get.ppid() 获取父进程号
子进程.terminate()终止进程
子线程.terminate()终止线程 terminate 使终止,就是个方法
import multiprocessing
import time
import os
def sing(num):
a = os.getpid()
print(a)
for i in range(num):
print('唱歌中..')
time.sleep(0.2)
def dance(num):
b = os.getpid()
print(b)
for i in range(num):
print('跳舞中..')
time.sleep(1)
if __name__ == '__main__':
sing_process = multiprocessing.Process(target=sing,args=(5,))
dance_process = multiprocessing.Process(target=dance,args=(4,))
sing_process.start()
dance_process.start()