- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:我已查明问题出在我下载 Zip 文件并解析它的程序部分。如果我将其注释掉并用默认行替换它,它会毫无问题地解析 10,000 次。
不确定应该编辑多少这个问题以反射(reflect)该发现。
我编写了一个 python 程序,它下载一个 zip 文件,其中包含一个大约 10,000 行的日志文件。然后逐行解析该文件,并将数据存入数据库。
最终我的脚本将运行 200 个服务器/zip 文件并处理大约 100,000 行。 (不是所有的服务器都有需要的文件)
但是,目前当我用 1 个消费者运行脚本时,我只将大约 13 行处理到数据库中。如果我运行 2 个消费者,我得到 24 个。如果我运行 10 个消费者,我得到 100 个,如果我运行 20 个消费者,我得到 240 个。
有时,运行脚本的结果是“Consumer Finished”,其中包含数据库中的条目数(远远低于我预期的 10K-30K),但其他时候,我收到一条错误消息:
> Traceback (most recent call last): File
> "C:\Python27\lib\multiprocessing\queues.py", line 262, in _feed
> send(obj) IOError: [Errno 232] The pipe is being closed
是什么导致了这个问题?附件是我的代码的修改版本,用于删除敏感数据:
import urllib, urlparse
import sys
import os
import datetime
from calculon import Calculon
import random
import pprint
import time
import random
import urllib, urlparse
import traceback
import psycopg2
import psycopg2.extras
from datetime import date, datetime, time, timedelta
import os.path
import requests
import io
import urllib2, cStringIO, zipfile
import re
import httplib
import urlparse
def daterange(start_date, end_date):
for n in range(int((end_date - start_date).days)):
yield start_date + timedelta(n)
def producer(args):
print "Producing!"
logdt_start = args["logdt_start"]
logdt_end = args["logdt_end"]
for single_date in daterange(logdt_start, logdt_end):
logdt = single_date + timedelta(days=1)
print "Reading log file..."
for x in range(1,2):
servername = "server-{0}".format("%02d" % (x,))
filename = "zipped_log.log{0}".format(logdt.date().isoformat())
url = "http://url.to.zip.file/{0}/{1}".format(servername, filename)
zip_path = 'path/to/file/within/zip/{0}/{1}'.format(servername, filename)
if httpExists(url):
try:
request = urllib2.urlopen(url)
zipinmemory = cStringIO.StringIO(request.read())
with zipfile.ZipFile(zipinmemory) as archive:
with archive.open(zip_path) as log:
print "File Found! Reading %s..." % filename
for line in log:
args["_queue"].put(line)
print "Queue has approximatly {0} items".format(args["_queue"].qsize())
except:
print "exception could not load %s" % url
traceback.print_exc()
return True
def httpExists(url):
host, path = urlparse.urlsplit(url)[1:3]
found = 0
try:
connection = httplib.HTTPConnection(host) ## Make HTTPConnection Object
connection.request("HEAD", path)
responseOb = connection.getresponse() ## Grab HTTPResponse Object
if responseOb.status == 200:
found = 1
#else:
#print "Status %d %s : %s" % (responseOb.status, responseOb.reason, url)
except Exception, e:
print e.__class__, e, url
return found
def parse_log(line):
if len(line) < 10 or line[0] != '[':
return {}
mod_line = line
mod_line = mod_line.replace(' ', ' ') #whats this for?
query_dict = {}
match = re.search('([\d:\/\s]+)\sUTC', mod_line)
s = match.start()
e = match.end() - 5
query_dict['date_ts'] = datetime.strptime(mod_line[s:e], '%d/%m/%Y %H:%M:%S:%f')
e = e+2
mod_line = mod_line[e:]
match = re.search('(\w+)\sLogger:\s', mod_line)
e = match.end()
query_dict['status'] = match.group(1)
mod_line = mod_line[e:]
for key_value in re.split(',', mod_line):
keypair = re.search('(\w+)=(\w+)', key_value)
key = keypair.group(1)
value = keypair.group(2)
query_dict[key] = value
return query_dict
def consumer(args):
global consumed
consumed += 1
print "Consumed : {0}".format(consumed)
try:
db = args["db"]
cname = args["cname"]
arg_value = args["_value"]
cur = db.cursor()
error_count = 0
if arg_value is None:
print "Consumer Finished!"
return False
line = arg_value
qdict = parse_log(line)
if len(qdict) == 0:
print "No data to consumer %s" % cname
return None
query = """
INSERT INTO my_db(date_ts,
status, cmd, creativeString, environment_id, client_type_id, platform_id, sn_type_id, user_id,
device_id, invoker_sn_id, invoker_type, poster_sn_id, origin, event_type, creative_id, ch,
src, afp, cmp, p1, p2,p3)
VALUES (%(date_ts)s,%(status)s,%(cmd)s,%(creativeString)s,%(environment_id)s,%(client_type_id)s,%(platform_id)s,
%(sn_type_id)s,%(user_id)s,%(device_id)s,%(invoker_sn_id)s,%(invoker_type)s,%(poster_sn_id)s,%(origin)s,
%(event_type)s,%(creative_id)s,%(ch)s, %(src)s, %(afp)s, %(cmp)s,
%(p1)s, %(p2)s, %(p3)s);
"""
try:
cur.execute(cur.mogrify(query, qdict))
db.commit()
global processed
processed += 1
print "processed : {0}".format(processed)
except:
error_count = error_count + 1
print "ERROR in insert {0}".format(error_count)
traceback.print_exc()
print qdict
sys.exit(2)
except:
print "Error in parsing: " + val
tracback.print_exc()
sys.exit(12)
def main():
log_start = datetime(2015,1,19);
log_end = datetime(2015,1,20);
consumer_args_list = []
noOfConsumers = 1;
for x in range(0, noOfConsumers):
print "Creating Consumer {0}".format(x)
print "Connecting to logs db..."
db_name = 'mydb'
connString = "dbname={0} host={1} port={2} user={3} password={4}".format(db_name, 'localhost', 5433, 'postgres', 'pword')
db = psycopg2.connect(connString)
consumer_args = {"cname": "CONSUMER_{0}".format(x), "db":db}
consumer_args_list.append(consumer_args)
calculon = Calculon( producer,
[{"logdt_start": log_start,
"logdt_end": log_end}],
True,
consumer,
consumer_args_list,
True)
result = calculon.start()
consumed = 0
processed = 0
if __name__ == "__main__":
main()
输出看起来像这样:
> Creating Consumer 0
Connecting to logs db...
Producing!
Reading log file...
File Found! Reading log2015-01-20...
Queue has approximatly 9549 items
Consumed : 1
processed : 1
Consumed : 2
processed : 2
Consumed : 3
processed : 3
Consumed : 4
processed : 4
Consumed : 5
processed : 5
Consumed : 6
processed : 6
Consumed : 7
processed : 7
Consumed : 8
processed : 8
Consumed : 9
processed : 9
Consumed : 10
processed : 10
Consumed : 11
processed : 11
Consumed : 12
processed : 12
Consumed : 13
Traceback (most recent call last):
File "C:\Python27\lib\multiprocessing\queues.py", line 262, in _feed
send(obj)
IOError: [Errno 232] The pipe is being closed
最佳答案
错误原来是输入文件中的错误行,它破坏了正则表达式。
例如:逗号分隔列表的值之一是:foobar=2, foo=Something here, is ,a really, poor value, bar=2
我能够通过在消费者方法中添加以下代码来解决问题:
try:
qdict = parse_adx_client_log(line)
except:
qdict = {}
print "BAD LINE {0}".format(line)
if len(qdict) == 0:
print "No data to consumer %s" % cname
return None
关于python - 为什么我的消费者不消费?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28172170/
kafka的Java客户端-消费者 一、kafka消费方式 pull(拉)模式:consumer采用从broker中主动拉取数据。Kafka 采用这种方式 push(推)模式:Kafka没有采用这种方
我编写这个小应用程序是为了解决 Python 中的经典生产者/消费者问题。我知道我可以使用线程安全的队列机制来解决这个问题,但我有兴趣自己解决这个问题来学习。 from threading impor
下面是一个示例消费者/生产者模型的代码: int buffer[MAX]; int fill_ptr = 0; int use_ptr = 0; int count = 3; void put(int
我的消费者、生产者程序有问题,它似乎可以加载,但返回段错误。我已经尝试了一切来修复它,但仍然失败!将不胜感激任何帮助。笔记;代码真的很多,semaphore.h的代码都在里面,有谁想测试一下。其余代码
我正在阅读著名的操作系统概念书(Avi Silberschatz、Peter Baer Galvin、Greg Gagne)第 9 版:http://codex.cs.yale.edu/avi/os-
我正在尝试构建一个服务,为许多异步客户端提供队列以发出请求并等待响应。我需要能够通过每 Y 个持续时间的 X 个请求来限制队列处理。例如:每秒 50 个 Web 请求。它用于第 3 方 REST 服务
我正在尝试使用一组资源来实现生产者/消费者模式,因此每个线程都有一个与之关联的资源。例如,我可能有一个任务队列,其中每个任务都需要一个 StreamWriter写出它的结果。每个任务还必须有参数传
为什么我们需要 Azure 存储帐户上的 blob 容器用于 Eventhub 消费者客户端(我使用的是 python)。为什么我们不能像在 Kafka 中那样直接使用来自 Eventhub(Kafk
我有一个有趣的生产者-消费者衍生产品需要实现,但我无法理解它的算法。因此,每个生产者都会“产生”给定范围(最小值,最大值)之间的数字,这对除以给定“商”给出了相同的提醒。对于消费者来说也是如此。 额外
我需要实现一种生产者/消费者方案,出于性能原因,消费者尝试在一批中处理许多工作项(每个工作项都会耗尽工作队列)。 目前,我只是创建固定数量的相同工作人员,它们在循环中的同一队列上工作。由于其中一些可能
为什么我们需要 Azure 存储帐户上的 blob 容器用于 Eventhub 消费者客户端(我使用的是 python)。为什么我们不能像在 Kafka 中那样直接使用来自 Eventhub(Kafk
我的关系必须按如下方式运作;线程 A 向线程 B 发布一些更改,线程 B 接受该更改并将其发布到线程 C。 问题是生产者-消费者,我使用 BlockingQueue 仅用两个实体来实现它没有问题。我怎
我一直在研究 PC 问题,以了解 Java 同步和线程间通信。使用底部的代码,输出为 Producer produced-0 Producer produced-1 Producer produced
我编写了代码来实现生产者-消费者问题,它似乎工作正常,不需要同步。这可能吗? 如何测试代码并检查它是否确实正常工作?我如何知道是否会发生死锁?现在,我没有跳出循环(即生产者不断插入,消费者不断在无限循
我必须完成一项练习,我必须使用至少一个生产者线程和 x 个消费者线程的生产者/消费者模式在我的文件夹路径中查找“.java”文件。 生产者消费者级:首先,当生产者完成查找文件时,我尝试通过设置从 tr
我被分配了一项类(class)作业来实现消费者/生产者问题的解决方案,该解决方案使用单个生产者、单个消费者和循环缓冲区。这应该用 C 语言编写。 不幸的是,我们没有获得任何学习 Material ,并
有人可以检查我的代码并告诉我是否走在正确的轨道上。我似乎有点迷失了。如果您看到我的错误,请告诉我它们。 我想做的是使用我自己的信号量以及 GCD 来解决有界缓冲区问题。 提前致谢.. sema.c v
我要处理有界缓冲区、生产者消费者问题,只能修改 prod 和 cons 函数。此代码仅在一个消费者和生产者线程上运行,不会出现任何问题。但对于每个都有多个,迟早总会给我带来同样的问题: p5p1:
我有一个从多个线程访问的类的实例。此类接受此调用并将元组添加到数据库中。我需要以串行方式完成此操作,因为由于某些数据库约束,并行线程可能会导致数据库不一致。 由于我不熟悉 C# 中的并行性和并发性,所
我正在尝试编写一个批量邮件服务,它有两种方法: add(Mail mail):可以发送邮件,由Producers调用 flushMailService():刷新服务。消费者应该获取一个列表,并调用另一
我是一名优秀的程序员,十分优秀!