Python多进程写入同一文件

最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫GIL的存在,使得Python在同一时间只能运行一个线程,所以只占用了一个CPU,由于我的电脑是4核的,所以CPU利用率就是25%了。

既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受GIL影响的。Python提供了一个multiprocessing的多进程库,但是多进程也有一些问题,比如,如果进程都需要写入同一个文件,那么就会出现多个进程争用资源的问题,如果不解决,那就会使文件的内容顺序杂乱。这就需要涉及到锁了,但是加锁一般会造成程序的执行速度下降,而且如果进程在多处需要向文件输出,也不好把这些代码整个都锁起来,如果都锁起来,那跟单进程还有什么区别。有一个解决办法就是把向文件的输出都整合到一块去,在这一块集中加个锁,这样问题就不大了。不过还有一种更加优雅的解决方式:使用multiprocessing库的回调函数功能。

具体思路跟把文件输出集中在一起也差不多,就是把进程需要写入文件的内容作为返回值返回给惠和的回调函数,使用回调函数向文件中写入内容。这样做在windows下面还有一个好处,在windows环境下,python的多进程没有像linux环境下的多进程一样,linux环境下的multiprocessing库是基于fork函数,父进程fork了一个子进程之后会把自己的资源,比如文件句柄都传递给子进程。但是在windows环境下没有fork函数,所以如果你在父进程里打开了一个文件,在子进程中写入,会出现ValueError: I/O operation on closed file这样的错误,而且在windows环境下最好加入if __name__ == '__main__'这样的判断,以避免一些可能出现的RuntimeError或者死锁。

下面是代码:

from multiprocessing import Pool
import time


def mycallback(x):
    with open('123.txt', 'a+') as f:
        f.writelines(str(x))


def sayHi(num):
    return num


if __name__ == '__main__':
    e1 = time.time()
    pool = Pool()

    for i in range(10):
        pool.apply_async(sayHi, (i,), callback=mycallback)

    pool.close()
    pool.join()
    e2 = time.time()
    print float(e2 - e1)

def log_result(res):
    list=[]
    f = open("out.csv", "a")
    for k in res:
        f.write(k+"\n")
    f.close()   
         
def getContenByUrl(url):
    list=[]
    file_object = open(url, 'r')
    try:
        for line in file_object.readlines():
            list.append(line.strip('\n'))
    finally:
        file_object.close()
    return list


    
if __name__ == '__main__':
    
    print "test" 
    print map_route
 
    get_map_route()
    #print map_route
    pool = Pool(processes=12) 
    list=getFileList(filefolder)
    k=0
    for file in list:
        print file , k
        k=k+1
        pool.apply_async(readFileByFilename,(file,'type1'),callback = log_result)
        #readFileByFilename(file)
        
    pool.close()
    pool.join()        
        

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,可以使用 `multiprocessing` 模块来实现多进程读写文件。 以下是一个示例代码,其中有两个进程,一个进程用于写入数据到文件中,另一个进程用于读取文件中的数据: ```python import multiprocessing # 写入数据到文件的进程 def write_data(filename, data_queue): with open(filename, "w") as f: while True: data = data_queue.get() if data == "STOP": break f.write(data + "\n") # 读取数据从文件的进程 def read_data(filename, data_queue): with open(filename, "r") as f: for line in f: data_queue.put(line.strip()) if __name__ == "__main__": # 创建一个进程共享队列 data_queue = multiprocessing.Queue() # 创建写入文件的进程 write_process = multiprocessing.Process(target=write_data, args=("data.txt", data_queue)) # 创建读取文件的进程 read_process = multiprocessing.Process(target=read_data, args=("data.txt", data_queue)) # 启动进程 write_process.start() read_process.start() # 等待写入进程完成 write_process.join() # 停止读取进程 data_queue.put("STOP") ``` 在这个例子中,我们创建了一个共享队列 `data_queue`,写入进程将数据写入这个队列,读取进程从这个队列中读取数据。 需要注意的是,在写入进程中,我们需要将数据写入文件中并且添加一个换行符,而在读取进程中,我们需要使用 `strip()` 方法来去掉读取的每一行数据的换行符。此外,在写入进程完成后,我们向队列中添加一个 `STOP` 标记来停止读取进程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值