导航:首页 > 编程语言 > python多进程log

python多进程log

发布时间:2024-09-05 13:24:38

‘壹’ python 多线程logger问题

因为logging是threadsafe的,但不是process-safe(应该没有这个词儿,只是为了便于理解)的。这段代码就是多个进程共同操作一个日志文件。这种情况下,logging的行为就很难说了。


我测试了一下,日志中大概几百行。而且,可以看到一些顺序错乱现象:

Fri, 08 Aug 2014 01:19:38 logging_in_multithread.py[line:40] theadWorking ERROR 2
FFri, 08 Aug 2014 01:19:36 logging_in_multithread.py[line:40] theadWorking ERROR 11(注意这里的FFri)


把代码这样改:

fornuminrange(processNum):
p=Process(target=processWorking,args=('2',))
processs.append(p)
p.start()
p.join()

还有其他方法,比如:为logging实现一个FileHandler,以使logging在multiple process的环境下也能正常工作。这是我从网上了解到的做法,自己还没实践过。


Python Manual中logging Cookbook中有这么一段话:

Logging to a single file from multiple processes

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing processes to perform this function.)

这段话中也提出了另外一种解决方案。

‘贰’ Python3多进程运行返回值怎么获得

frommultiprocessingimportPool
importtime
defwork(n):
print('开工啦...')
time.sleep(3)
returnn**2

if__name__=='__main__':
q=Pool()

#异步apply_async用法:如果使用异步提交的任务,主进程需要使用jion,等待进程池内任务都处理完,然后可以用get收集结果,否则,主进程结束,进程池可能还没来得及执行,也就跟着一起结束了
res=q.apply_async(work,args=(2,))
q.close()
q.join()#join在close之后调用
print(res.get())

#同步apply用法:主进程一直等apply提交的任务结束后才继续执行后续代码
#res=q.apply(work,args=(2,))
#print(res)

‘叁’ python并发编程之多进程方式(multiprocessing模块)

Python的并发编程提供了多进程方式来提高效率,通过multiprocessing模块实现。下面将详细阐述进程与线程的区别,以及如何使用多进程来优化任务执行。

在并发编程中,进程就像工厂的车间,每个车间运行一个独立的线程,即工人。为了提升生产效率,我们需要理解进程和线程的协作与独立性。

首先,我们通过串行执行程序,将两个数值传递给func函数,逐个处理。这展示了单进程的工作方式,随后引入多进程。Python的multiprocessing模块允许我们创建多个并行运行的进程。通过Process类,我们创建子进程,它们独立于主进程,没有执行顺序,如下面的代码所示:

python
import multiprocessing as mp
# 创建子进程
p1 = mp.Process(target=func, args=(数值1,))
p2 = mp.Process(target=func, args=(数值2,))

主进程在子进程启动后继续执行,由于子进程各自独立轮询,主进程完成的时间会早于子进程。当子进程轮询序列相同时,它们会同时完成,如代码中所述:

python
# 使用join方法等待子进程结束
p1.start()
p2.start()
p1.join()
p2.join()

在实际应用中,尤其是需要处理大量数据或任务的场景,我们可以使用循环来创建多个子进程,以进一步提高效率。通过多进程方式,Python为我们提供了一种高效且灵活的并发解决方案。

‘肆’ python最多多少进程(linux最多多少进程)

导读:今天首席CTO笔记来给各位分享关于python最多多少进程的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

python进程池最大数量

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

pythonmultiprocessing最大多少进程

最大进程只受操作系统资源限制.

不是进程越多越好,程序的速度就越快.

一般有几个CPU核心,就开多少进程,或者核心数的N倍.

pythonprocess最多能多少个进程

由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

python多进程

基于官方文档:

日乐购,刚才看到的一个博客,写的都不太对,还是基于官方的比较稳妥

我就是喜欢抄官方的,哈哈

通常我们使用Process实例化一个进程,并调用他的start()方法启动它。

这种方法和Thread是一样的。

上图中,我写了p.join()所以主进程是等待子进程执行完后,才执行print("运行结束")

否则就是反过来了(这个不一定,看你的语句了,顺序其实是随机的)例如:

主进加个sleep

所以不加join(),其实子进程和主进程是各干各的,谁也不等谁。都执行完后,文件运行就结束了

上面我们用了os.getpid()和os.getppid()获取当前进程,和父进程的id

下面就讲一下,这两个函数的用法:

os.getpid()

返回当前进程的id

os.getppid()

返回父进程的id。父进程退出后,unix返回初始化进程(1)中的一个

windows返回相同的id(可能被其他进程使用了)

这也就解释了,为啥我上面的程序运行多次,第一次打印的parentid都是14212了。

而子进程的父级processid是调用他的那个进程的id:1940

视频笔记:

多进程:使用大致方法:

参考:进程通信(pipe和queue)

pool.map(函数可以有return也可以共享内存或queue)结果直接是个列表

poll.apply_async()(同map,只不过是一个进程,返回结果用xx.get()获得)

报错:

参考:

把pool=Pool()放到ifname=="main":下面初始化搞定。

结果:

这个肯定有解释的

测试多进程计算效果:

进程池运行:

结果:

普通计算:

我们同样传入1210三个参数测试:

其实对比下来开始快了一半的;

我们把循环里的数字去掉一个0;

单进程:

多进程:

两次测试单进程/进程池分别为0.669和0.772几乎成正比的。

问题二:

视图:

post视图里面

Music类:

直接报错:

写在类里面也在函数里用self.pool调用也不行,也是相同的错误。

最后把pool=Pool直接写在search函数里面,奇迹出现了:

前台也能显示搜索的音乐结果了

总结一点,进程这个东西,最好写在直接运行的函数里面,而不是一个函数跳来跳去。因为最后可能是在子进程的子进程运行的,这是不许的,会报错。

还有一点,多进程运行的函数对象,不能是lambda函数。也许lambda虚拟,在内存??

使用pool.map子进程函数报错,导致整个pool挂了:

参考:

主要你要,对函数内部捕获错误,而不能让异常抛出就可以了。

关于map传多个函数参数

我一开始,就是正常思维,多个参数,搞个元祖,让参数一一对应不就行了:

报错:

参考:

普通的process当让可以穿多个参数,map却不知道咋传的。

apply_async和map一样,不知道咋传的。

最简单的方法:

使用starmap而不是map

结果:

子进程结束

1.8399453163146973

成功拿到结果了

关于map和starmap不同的地方看源码

关于apply_async(),我没找到多参数的方法,大不了用一个迭代的starmap实现。哈哈

关于上面源码里面有itertools.starmap

itertools用法参考:

有个问题,多进程最好不要使用全部的cpu,因为这样可能影响其他任务,所以在进程池添加process参数指定,cpu个数:

上面就是预留了一个cpu干其他事的

后面直接使用Queue遇到这个问题:

解决:

Manager().Queue()代替Queue()

因为queue.get()是堵塞型的,所以可以提前判断是不是空的,以免堵塞进程。比如下面这样:

使用queue.empty()空为True

结语:以上就是首席CTO笔记为大家介绍的关于python最多多少进程的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。

阅读全文

与python多进程log相关的资料

热点内容
手机proxy服务器地址 浏览:449
吉他清音压缩 浏览:301
简历模板程序员 浏览:881
螺杆压缩机虚标型号 浏览:953
idea开发项目服务器ip地址 浏览:125
串口服务器出现乱码怎么解决 浏览:950
命令按钮的default 浏览:161
战网如何登录其他服务器 浏览:990
中国银行app如何关闭短信 浏览:493
nx120编程技巧 浏览:722
手机也能使用源码公式 浏览:918
怎样把压缩的文件下载 浏览:334
pdf是哪的 浏览:27
群晖服务器如何建立自己数据库 浏览:868
win10怎么查找服务器地址 浏览:506
freepdfsplit 浏览:172
如何更改linux服务器地址 浏览:221
编程求字符串abcdefh长度 浏览:312
座机时间服务器地址 浏览:419
华康宝app是怎么样的 浏览:73