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

NoAnyLove

V2EX 第 207963 号会员,加入于 2016-12-28 06:36:26 +08:00
今日活跃度排名 21248
NoAnyLove 最近回复了
回答这个问题我压力山大,感觉一不小心就暴露了年龄(手动捂脸)。

首先,程序使用了 UPX 进行压缩,会在原基础上更小一些。解压之后可以看大是用的 VC 7.0 编译。用资源工具打开可以看到对话框资源,那么基本上可以认为,程序使用 RC 定义界面,然后直接调用 Win32 API 实现功能。(对 MFC 不了解,不知道 MFC 编译出来是不是这个样子)
摸了摸我桌子上比 y50 还要早一代的老旧笔记本,不知道该说些什么(手动泪奔)
都考虑 X1 Carben 了,为啥不考虑 Extream 呢?
42 天前
回复了 huanyingch01 创建的主题 程序员 你们都是用什么编程字体的?
Fantasque Sans Mono + 1,Nerd Font 版
50 天前
回复了 onice 创建的主题 Python Python 开发大家用的什么开发工具呀?
PyCharm
VS Code
Nvim + 插件
86 天前
回复了 surfire91 创建的主题 Python 媳妇去面试,被问“ Python 的三要素是啥”
红黄蓝?
119 天前
回复了 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 改变。
121 天前
回复了 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
123 天前
回复了 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
```
127 天前
回复了 fghjghf 创建的主题 Python 急急急, Python 多进程,如何传递 epoll?
利用继承,在创建其他进程前先创建 epoll,创建其他进程 fork 的时候就自动传递到其他进程中了。
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3454 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 15ms · UTC 10:18 · PVG 18:18 · LAX 03:18 · JFK 06:18
♥ Do have faith in what you're doing.