Python多处理连续处理与await

标签 python selenium async-await multiprocessing python-3.5

我正在使用基于事件的系统,该系统使用新的 Python 3.5 协程和等待。我注册事件,这些事件由系统调用。

@event
aysnc def handleevent(args):
    # handle the event

我需要初始化一些类来处理工作(耗时)。然后调用实例方法,也很耗时(他们实际上使用selenium来浏览某些网站)。

理想情况下,我想要类似以下代码的内容

# supposedly since this is multiprocessing this is a different driver per process
driver = None
def init():
    # do the heavy initialization here
    global driver
    driver = webdriver.Chrome()

def longworkmethod():
    ## need to return some data
    return driver.dolongwork()

class Drivers:
""" A class to handle async and multiprocessing"""
    def __init__(self, numberOfDrivers):
        self.pool = multiprocessing.Pool(processes=numberOfDrivers, initializer=init)       

    async def dowork(self, args):
        return self.pool.apply_async(longworkmethod, args=args)


### my main python class
drivers = Drivers(5)

@event
aysnc def handleevent(args):
    await drivers.dowork(args)

@event
aysnc def quit(args):
    ## do cleanup on drivers
    sys.exit(0)

这段代码不起作用,但我尝试了很多不同的方法,但似乎都无法做到我想要的。

它不一定是这种精确的形式,但我如何将等待和协程与需要多处理的程序混合在一起?

最佳答案

虽然从技术上讲没有什么会限制您混合 asynciomultiprocessing,但我建议避免这样做。这会增加很多复杂性,因为您最终需要每个线程一个事件循环,并且来回传递信息将很棘手。只需使用其中之一即可。

asyncio 提供在另一个线程中运行任务的函数 - 例如 AbstractEventLoop.run_in_executor 。看看这些答案

或者,您可以只使用multiprocessing,因为selenium具有阻塞(非异步)接口(interface),但是听起来您的某些代码已经在使用asyncio,所以也许坚持与上述。

关于Python多处理连续处理与await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080185/

相关文章:

python - 获取本地时区的 Olson TZ 名称?

c# - 如何使用 C# 通过 Selenium WebDriver 获取下拉列表中的所有选项?

javascript - 等待循环中的 promise

javascript - forEach 循环中的异步 API 调用

python - 使用 Paramiko invoke_shell() 执行的命令的输出是分页的(在 recv 中获取 "--more--")

python - 从 tableView 模型打印单击行的数据

python - 从 Python 3 控制 Arduino 继电器

python - 在 Robot Framework 中禁用 "DevTools listening on ws://127.0.0.1..."日志消息

java - 我无法使用 Selenium WebBrowser Java 打开任何内容

reactjs - 在 firebase.utils.js 的函数内传递 props