首页   注册   登录
 NoAnyLove 最近的时间轴更新

NoAnyLove

V2EX 第 207963 号会员,加入于 2016-12-28 06:36:26 +08:00
NoAnyLove 最近回复了
29 天前
回复了 fghjghf 创建的主题 Python 急急急, Python 多进程,如何传递 epoll?
通常 pickle 只是将对象转成二进制数据。`multiprocessing.reduction`中提供了对 socket 对象的 pickle 支持,实际上在二进制数据传输的背后还设计到了跨进程传递 fd,但是并未提供对 epoll 的支持。

要实现传递 epoll,一种方法就是按照我前面的示例代码,在创建 Pool 前先创建 epoll,可以使用全局变量保存 epoll,这样 worker 进程中可以直接使用;或者使用局部变量,然后通过 Pool 函数的 initializer 和 initargs 传递给 worker 保存起来之后用。直接通过 apply 或者 apply_sync 之类的函数传递会要求实现 pickle。

另外一种方法,通过`multiprocessing.reduction.send_handle`来发送句柄,参见 gist.github.com/bdarnell/1073945,一样的做法,只不过是把传递的内容换成 epoll.fileno,接受的时候使用 epoll.fromfd。

此外,也可以参照`multiprocessing.reduction`中 reduce_socket/rebuild_socket 的做法实现 epoll 的支持。

需要注意的是,跨进传递句柄会使得 fd 改变。
31 天前
回复了 fghjghf 创建的主题 Python 急急急, Python 多进程,如何传递 epoll?
因为是 fork 啊,当然是同一个地址。你是怎么传递 socket 的? socket 是在创建 Pool 之后才创建的? socket 直接当做参数传递了?

fork 之后创建的 socket 需要跨进程复制句柄的。

话说,你这种“然后你再试一试,用你传过去的 epoll. modify.发现并不管用。”这种交流方式让人很难继续交流下去啊,没有示例代码和具体错误你想让我试啥?麻烦尽量简单准确的描述问题,用简短可以执行的代码和具体错误信息来描述问题。

github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
33 天前
回复了 fghjghf 创建的主题 Python 急急急, Python 多进程,如何传递 epoll?
IPC 传递和向 worker 传递参数都需要将数据 pickle 成二进制之后再发送。对于 epoll 对象需要自己写函数来支持,还涉及到复制 fd,非常麻烦,又不是 Windows 下传递句柄,没必要这样折腾。

继承怎么不行了?

```
>>> import os
>>> import select
>>> import multiprocessing.pool
>>> ep = select.epoll()
>>> def init(epoll):
... print(f'PID: {os.getpid()}, epoll: {epoll}, fd: {epoll.fileno()}')
...
>>> pool=multiprocessing.pool.Pool(5, init, [ep])
PID: 28331, epoll: <select.epoll object at 0x7fc305f41588>, fd: 3
PID: 28329, epoll: <select.epoll object at 0x7fc305f41588>, fd: 3
PID: 28333, epoll: <select.epoll object at 0x7fc305f41588>, fd: 3
PID: 28330, epoll: <select.epoll object at 0x7fc305f41588>, fd: 3
PID: 28332, epoll: <select.epoll object at 0x7fc305f41588>, fd: 3
```
37 天前
回复了 fghjghf 创建的主题 Python 急急急, Python 多进程,如何传递 epoll?
利用继承,在创建其他进程前先创建 epoll,创建其他进程 fork 的时候就自动传递到其他进程中了。
44 天前
回复了 wikinee 创建的主题 Python Python 拷贝大文件分片大小问题
发个 github 链接需要验证手机号码?这是啥套路?
44 天前
回复了 wikinee 创建的主题 Python Python 拷贝大文件分片大小问题
正确的拷贝大文件的正确套路是。。。。。有系统 API 就直接用系统 API,cpython/blob/master/Lib/shutil.py#L227
73 天前
回复了 shengyu 创建的主题 程序员 Firefox 证书过期导致插件全炸
Orz,原来是这个原因。。。。。不过普通版本禁用插件签名的选项也无效。最后换上了许久不用的 Developer 版本。。。。。。。
73 天前
回复了 hujianxin 创建的主题 Vim Vim 下面哪一款 LSP Client 比较靠谱?
@chemzqm 感谢,已经解决了,问题是因为 jedi 的版本太老。
。。。。。。没看懂“核心缺点”到底在啥。。。。。硬性需求是啥?
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2417 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 11ms · UTC 00:37 · PVG 08:37 · LAX 17:37 · JFK 20:37
♥ Do have faith in what you're doing.