我做了很多关于多处理的研究! 基本上,我正在从API下载数据并插入数据库。
我制作了一个池并使用pool.imap访问下载功能,用结果制作一个元组,并在数据库中一次性插入所有内容。
我反复访问此功能,并且在某个时间点我的进程挂起了! 我试图遵循 https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map 并访问超时的联接。
但是 pool.join(timeout( 返回 "TypeError: join(( 正好需要 1 个参数(给定 2 个("。我想一个参数是默认的"自我"?
一小段代码:
timeout = 10
pool = Pool(10)
in_tuple = [x for x in pool.imap(multi_details,items) if x is not None]
pool.close()
pool.join(timeout) # from the documentation I should be able to put the timeout in join
writing_to_database(in_tuple)
# function that generate the content for DB
def multi_details(item):
tuple = get_details(item)
return tuple
我看到了创建进程和生成终止((或加入(超时(的不同方法,但两者都没有使用imap/map - 这在我的情况下要简单得多!
与Process
类不同,Pool
类在其join
方法中不接受timeout
参数: https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.join
这就是解决方案!
我没有设法使用"next(timeout(",因为它只是在运行整个列表之前解析几个项目而不是停止!
我开始使用apply_async。唯一的问题是我有一种奇怪的感觉,它比imap慢。
功能代码为:
timeout = 1
pool = Pool(10)
for x in items:
try:
res = pool.apply_async(multi_details,(x,)).get(timeout)
except Exception as e:
pass # you can put anything you want but my scope was to skip the things that took too much!
else:
if res is not None: # now this could be a better pythonic way to write this. Any help will be highly appreciated!
in_tuple.append(res)
pool.close()
pool.join()
谢谢,希望有用!