gpt4 book ai didi

python - Scrapy mysql 管道 runInteraction() 中的关键部分

转载 作者:太空宇宙 更新时间:2023-11-03 19:15:35 25 4
gpt4 key购买 nike

我需要帮助修复管道 scrapy 代码中的关键部分。

我在 scrapy 中使用这个 MySQL 管道(来自 http://snippets.scrapy.org/snippets/33/ ):

class SQLStorePipeline(object):

def __init__(self):
self.dbpool = adbapi.ConnectionPool('MySQLdb', db='mydb',
user='myuser', passwd='mypass', cursorclass=MySQLdb.cursors.DictCursor,
charset='utf8', use_unicode=True)

def process_item(self, item, spider):
# run db query in thread pool
query = self.dbpool.runInteraction(self._conditional_insert, item)
query.addErrback(self.handle_error)

return item

def _conditional_insert(self, tx, item):
# create record if doesn't exist.
# all this block run on it's own thread


# START CRITICAL SECTION
some_critical_code_here
# STOP CRITICAL SECTION


tx.execute("select * from websites where link = %s", (item['link'][0], ))
result = tx.fetchone()
if result:
log.msg("Item already stored in db: %s" % item, level=log.DEBUG)
else:
tx.execute(\
"insert into websites (link, created) "
"values (%s, %s)",
(item['link'][0],
datetime.datetime.now())
)
log.msg("Item stored in db: %s" % item, level=log.DEBUG)

def handle_error(self, e):
log.err(e)

一切正常。

如您所见,我已经知道代码中的关键部分在哪里。但是我对Python真的很陌生并且不知道如何使用一些锁或类似的东西来防止多个线程进入关键部分。

你能帮我一下吗?如果您可以向我发送输入和离开关键部分的代码,我可以在此代码中使用,那就太好了。

谢谢大家。

最佳答案

即使您使用的是 Twisted,通常涉及阻止的所有事情都需要以不同的方式完成,但您处于 Twisted 的特定部分,其中阻止是可以的。因此,这应该像分配一个所有线程都能够引用的 Lock 对象一样简单,然后获取它:

import threading

insert_critical_lock = threading.Lock()

...

def _conditional_insert(self, tx, item):

with insert_critical_lock:
# START CRITICAL SECTION
some_critical_code_here
# STOP CRITICAL SECTION

tx.execute("select * from websites where link = %s", (item['link'][0], ))
...

关于python - Scrapy mysql 管道 runInteraction() 中的关键部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com