Python 写入具有多个池的文件
您好,我正在从服务器查询一些数据,我想将找到的数据存储在一个文件中。如果我不使用池和多处理,我的数据会按其应有的方式写入文件。我做错了什么?提到了队列,但我认为我没有正确使用它们,也不知道如何使用它们。我对多重处理非常陌生 似乎只有最后一个值正在写入文件,或者根本不写入Python 写入具有多个池的文件,python,file-io,multiprocessing,Python,File Io,Multiprocessing,您好,我正在从服务器查询一些数据,我想将找到的数据存储在一个文件中。如果我不使用池和多处理,我的数据会按其应有的方式写入文件。我做错了什么?提到了队列,但我认为我没有正确使用它们,也不知道如何使用它们。我对多重处理非常陌生 似乎只有最后一个值正在写入文件,或者根本不写入 from multiprocessing import Pool import time import os import json import urllib2 import pprint start_time = time
from multiprocessing import Pool
import time
import os
import json
import urllib2
import pprint
start_time = time.time()
localtime = time.localtime()
unixtime = int(time.mktime(time.gmtime()))
if not os.path.exists('data'):
os.makedirs('data')
filename = ('data/%i_%i_%i_%i_%i_%i') % (localtime[2], localtime[1], localtime[0], localtime[3], localtime[4], localtime[5])
f = open(filename, 'w')
apikey = '_omitted_'
res = 90
lines = (360 * 180) / (res * res)
basepath = 'https://api.forecast.io/forecast/'+ apikey + '/'
def getdata(i,j):
url = basepath + str(j) + ',' + str(i) + ',' + str(unixtime)
data = json.load(urllib2.urlopen(url))
lat = data['latitude']
lon = data['longitude']
temp = data['currently']['temperature']
humidity = data['currently']['humidity']
pressure = data['currently']['pressure']
clouds = data['currently']['cloudCover']
winddir = data['currently']['windBearing']
windspd = data['currently']['windSpeed']
dewpoint = data['currently']['dewPoint']
precip = data['currently']['precipIntensity']
f.write(('%f %f %f %f %f %f %f %f %f %f\n') % (lat, lon, temp, humidity, pressure, clouds, winddir, windspd, dewpoint, precip))
#because output needs to be flushed...
f.close()
# print('%.2f%% Complete...' % (float(count / lines) * 100))
pool = Pool(processes=1)
for i in range (-180, 180, res):
for j in range (-90, 90, res):
# getdata(i,j)
pool.apply_async(getdata, (i, j))
pool.close()
pool.join()
print('Total time for Execution: %f Minutes' % ((time.time() - start_time) / 60))
当我更改进程数时,我的输出也会更改,进程越多,文件中显示的数据越多。我认为每个工人都在覆盖另一个工人或覆盖自己。似乎每个工人只适合写一行文字 所以我找到了一个解决办法。这些工作人员以自己的速度写入文件,因此文件不太有条理,但它符合我的目的。我想您应该使用回调函数来写入文件,这样可以确保在写入文件时进程是完整的。我仍然不认为这是一个合适的解决方案,但它是有效的
def getdata(i,j):
url = basepath + str(j) + ',' + str(i) + ',' + str(unixtime)
data = json.load(urllib2.urlopen(url))
lat = data['latitude']
lon = data['longitude']
temp = data['currently']['temperature']
humidity = data['currently']['humidity']
pressure = data['currently']['pressure']
clouds = data['currently']['cloudCover']
winddir = data['currently']['windBearing']
windspd = data['currently']['windSpeed']
dewpoint = data['currently']['dewPoint']
precip = data['currently']['precipIntensity']
return (('%f %f %f %f %f %f %f %f %f %f\n') % (lat, lon, temp, humidity, pressure, clouds, winddir, windspd, dewpoint, precip))
def writedata(data):
f.write(data)
pool = Pool(processes=40)
for i in range (-180, 180, res):
for j in range (-90, 90, res):
pool.apply_async(getdata, (i, j), callback=writedata)
pool.close()
pool.join()
f.close()
这在什么方面失败了?请发布错误消息或描述确切的问题。另外,您确定需要将所有内容存储在一个由多个进程写入的文件(可能会变得非常大)中吗?管理一个共享文件的开销可能会首先消除使用多处理的任何优势。从长远来看,您最好将每个进程写入一个单独的文件,然后管理一组文件供以后处理(这并不困难)。我没有收到任何错误消息,但当我查看文件时,它是空的。我不需要数据按任何特定顺序排列。该文件在峰值时最多只能达到50mb左右。