- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 macOS High Sierra(版本 10.13.6)中,我运行了一个执行以下操作的 Python 程序:
multiprocessing.Queue
的数据(URL 字符串)。 . requests
的 HTTP 请求包,即它使 requests.get()
调用。 objc[24250]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[24250]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
在用户上。
import multiprocessing as mp
import requests
def worker(q):
print('worker: starting ...')
while True:
url = q.get()
if url is None:
print('worker: exiting ...')
break
print('worker: fetching', url)
response = requests.get(url)
print('worker: response:', response.status_code)
def master():
q = mp.Queue()
p = mp.Process(target=worker, args=(q,))
q.put('https://www.example.com/')
p.start()
print('master: started worker')
q.put('https://www.example.org/')
q.put('https://www.example.net/')
q.put(None)
print('master: sent data')
print('master: waiting for worker to exit')
p.join()
print('master: exiting ...')
master()
$ python3 foo.py
master: started worker
master: sent data
master: waiting for worker to exit
worker: starting ...
worker: fetching https://www.example.com/
objc[24250]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[24250]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
master: exiting ...
requests
时发生包裹。如果我们在 worker()
中注释掉这两行,它解决了这个问题。 # response = requests.get(url)
# print('worker: response:', response.status_code)
q.put('https://www.example.com/')
时才会发生语句出现在 p.start()
之前陈述。如果我们在 p.start()
之后移动该声明,这解决了问题。 p.start()
print('master: started worker')
q.put('https://www.example.com/')
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
解决了这个问题。OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES python3 foo.py
import os
os.environ['OBJC_DISABLE_INITIALIZE_FORK_SAFETY'] = 'YES'
# Does not resolve the issue!
requests.get()
和 q.put()
之前 p.start()
?换句话说,如果不满足这些条件之一,为什么问题会消失? OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
在运行使用我们函数的程序之前在他们的 shell 中? 最佳答案
很好的问题描述!你得到了我的赞成。
现在回答:
fork()
之间使用和 exec()
在多线程父进程的子进程中。您不能在该时间间隔内调用任何 Objective-C 方法。这会导致竞争条件。即大多数时候它会工作,有时它会失败。例如:如果 fork()
时,父进程中的线程碰巧持有 Object-C 运行时的锁之一。发生时,子进程在尝试获取该锁时会死锁。 fork()
和 exec()
.但是,存在涉及 +initialize
的限制。方法。 (你的问题是在这个区域)。 fork
相关的复杂性:
fork
创建过程的副本。 execve()
将自身替换为不同的程序系统调用worker
)具有父进程的副本,并且该副本由
fork()
提供给子进程。 .但是,
fork()
不会复制所有内容!特别是,它不复制线程。子进程中不存在父进程中运行的任何线程
fork
之间做“任何事情”和
exec
.然而,在
fork
之间做任何事情都是非常不正确的。和
exec
.在您的情况下,请调用
q.put()
之前
p.start()
正如@Darkonaut 正确提到的那样,第一次调用时会启动一个馈线线程,并且 fork 已经是多线程的应用程序是有问题的。
+initialize
方法仍然有限制
fork()
.问题在于
+initialize
的线程安全保证在 Objective-C 运行时无法控制的状态周围隐式引入锁。
q.put()
或使用
requests
库(调用流行的请求库,这将最终调用 _scproxy 模块以获取系统代理,这将最终调用 +initialize 方法)在
p.start()
之前,它们中的任何一个都会导致您的父进程获取锁。您必须注意
fork
创建进程的副本。在你的情况下,当
q.put()
在
p.start()
之前被调用,
fork
发生在错误的时间,而您是
workers
谁得到父进程的副本,得到
lock
处于复制状态。
worker
, 你在做
q.get()
.这意味着获取锁,但是在
fork
期间已经获取了锁(来自 parent )。
worker
) 等待
lock
被释放但
lock
永远不会被释放。因为,释放它的线程没有被
fork()
复制过来。 .
+initialize
线程安全和 fork 安全。相反,Objective-C 运行时只是停止进程而不是运行任何
+initialize
在子进程中覆盖:
+[SomeClass initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead.
fork()
之间什么也不做和 exec()
(最好不要在 fork()
和 exec*()
之间使用请求)。 关于python - 在工作进程启动之前将数据放入输入队列时,工作进程在 requests.get() 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55924761/
我有一个测试即将进行,我想澄清两个有关参数的问题。 在我的笔记中指出,将参数传递给函数的推荐方法是使用“按引用传递” const type& x; // for "in" parameters
当我通过 OMG 2.5(Beta)推广的 UML 规范阅读以下概念时: in: Indicates that Parameter values are passed in by the caller
我试图在用户按下 Enter 时触发一个函数。我将此输入设置为只读的原因是限制用户在填充值后修改输入中的值。 该值来自将在点击属性中触发的弹出窗口。问题是 keyup.enter 没有触发该输入。 代
我在jQuery中使用模式弹出窗口控件,该弹出窗口具有由jQuery Tokenize输入插件提供动力的输入文本。问题是,当我在模式弹出文本框中键入内容时, token 化插件的搜索结果显示为隐藏在弹
我有一个问题。当我选中复选框时,系统工作正常,总值发生变化,但一旦我修改文本输入,它就会变为 0。我需要将此文本框输入排除在更改值之外。 这是 html: $15000 $
我正在努力让它发挥作用,但还是有些不对劲。 我想用 CSS 设置提交按钮的样式以匹配我已有的按钮。 风格: input[type="button"], input[type="submit"], b
import java.util.*;; public class selection { Scanner in=new Scanner(System.in); private
这可能是一个非常菜鸟的问题。假设我有一个带宽限制为 100MB/s 的网卡,那么输入/输出带宽是否有可能达到该限制 同时 ?或者我会在任何时候遇到这个不等式:in bandwidth + out ba
看着这个问题,Fill immutable map with for loop upon creation ,我很好奇是什么this表示在 Map(1 -> this) . scala> Map(1
我有这样的东西 一个 乙 问? 是或否 数字 数字或零 我想做的是: 如果 B1 = “Y”,则让用户在 B2 中输入一个数字。 如果 B1 = “N”,则将 B2 中的值更改为零,并且不允许用户在
我有一个包含许多列的表,我想添加 input标题单元格内的字段,但我希望输入适合根据正文内容的宽度。 这是没有 input 的样子领域: 这就是 input 的样子领域: 可以看出,像“index”和
关于为 FTP 客户端设置传出和传入文件夹,您遵循哪些最佳实践(如果有)?我们通常使用“outgoing”和“incoming”,但无论你如何表述方向,它都可以有两种解释方式,具体取决于名称相对于哪一
我正在尝试“求解”给定 d 的 Pell 方程:x^2 - d * y^2 = 1,或者至少我想得到最小的 x > 0 来求解方程。到目前为止,一切都很好。这是我的 Haskell 代码 minX :
我是VS Code的新手,可以使用Ctrl + Enter将代码运行到python交互式窗口中。我希望光标自动移动到下一行,因此我可以逐行浏览代码。 能做到吗? 最佳答案 如this blog pos
我正在创建一个 bool 值矩阵/二维数组,并且我想为 dategrid 推断一种不仅仅是“ANY”的类型。 let yearRange = [2000,2001,2002,2003,2004]; l
我有两个排序的列表,例如 a = [1, 4, 7, 8] b = [1, 2, 3, 4, 5, 6] 我想知道a中的每个项目是否在b中。对于上面的示例,我想找到 a_in_b = [True, T
菜鸟警报 这很奇怪 - 当我编写以下代码时,尝试在 AngularJS 中创建自定义指令: myModule.directive('myTab', function(){ console.lo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
假设我正在使用 gdscript 静态类型,并且对于一个函数参数,我事先不知道我会得到什么。这就是 python 中 typing.Any 的作用。如何使用 gdscript 做到这一点? 似乎 Va
我使用 dropzone 上传多个图像,并且工作正常,直到我想为每个图像插入品牌和网址。 我遇到的唯一问题是,当我要从输入字段获取值时,我会从服务器获取来自字段(品牌、网址)的未定义值,但如果我使用静
我是一名优秀的程序员,十分优秀!