如何结合多处理和事件



我有一个任务需要启动 2 个进程,在每个进程中需要启动 2 个线程才能真正工作。 以下是我用来模拟用例的源代码。

import multiprocessing
import eventlet
def subworker(num1, num2):
print 'Start subworker %d,%dn' % (num1, num2)
eventlet.sleep(10)
print 'End subworker %d,%dn' % (num1, num2)
def worker(**kwargs):
number = kwargs['number']
pool = eventlet.GreenPool(size=2)
pool.spawn_n(subworker, number, 1)
pool.spawn_n(subworker, number, 2)
pool.waitall()
def launcher(number):
kwargs = {'number': number}
th = multiprocessing.Process(target=worker, kwargs=kwargs)
th.start()
while True:
if not th.is_alive():
break
eventlet.sleep(0)
th.join()

def main():
pool = eventlet.GreenPool(size=2)
pool.spawn_n(launcher, 1)
pool.spawn_n(launcher, 2)
pool.waitall()
main()

当我运行这个 python 脚本时,我的预期输出是这样的:

启动子工作线程 1,1 启动子工作线程 1,2 启动子工作线程 2,1 启动子工作线程 2,2 最终子工作器 1,1 最终子工人 1,2 结束子工人 2,1 结束子工人 2,2

但我真正得到的是:

启动子工作线程 1,1 回溯(最近一次调用): 文件"/Users/leehom/python_local/lib/python2.7/site-packages/eventlet/greenpool.py",第 82 行,第 _spawn_n_impl 行 启动子工作线程 1,2 func(*args, **kwargs) 文件"/Users/leehom/Desktop/home/work_dir/source/snips/Test_multiprocessing_and_eventlet.py",第27行,在启动器 启动子工作线程 2,1 如果不是th.is_alive(): 文件"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py",第 155 行,is_alive 启动子工作线程 2,2 断言 self._parent_pid == os.getpid(), '只能测试子进程' 断言错误:只能测试子进程 启动子工作线程 1,1 启动子工作线程 1,2 启动子工作线程 2,1 启动子工作线程 2,2 最终子工作器 1,1 最终子工人 1,2 结束子工人 2,1 结束子工 2,2 最终子工作器 1,1 最终子工人 1,2 结束子工人 2,1 结束子工 2,2 进程已完成,退出代码为 0

似乎启动器被调用了两次。我不明白为什么会这样。

如果我在我的主函数中评论一行

def main():
pool = eventlet.GreenPool(size=2)
pool.spawn_n(launcher, 1)
# pool.spawn_n(launcher, 2)
pool.waitall()

结果是正确的:

启动子工作线程 1,1 启动子工作线程 1,2 最终子工作器 1,1 结束子工人 1,2

有人知道我如何解决这个问题以及为什么会出现这个问题?

截至 2018-01 年,Eventlet 和多处理不能很好地协同工作。最好的选择是在外部生成工作进程。第二好的选择是os.fork()创建工作进程,然后才import eventlet

订阅此问题,以便在解决多处理兼容性时收到通知。 https://github.com/eventlet/eventlet/issues/147

主模块应该是可导入的,以便多个进程正常工作。 不要在全局空间中调用main(),像这样使用它:

如果名称== 'main': 主()

相关内容

  • 没有找到相关文章

最新更新