Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit6787fbf

Browse files
Use _interpreters.call().
1 parentd58f54e commit6787fbf

File tree

1 file changed

+40
-67
lines changed

1 file changed

+40
-67
lines changed

‎Lib/concurrent/futures/interpreter.py

Lines changed: 40 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,8 @@ def resolve_task(fn, args, kwargs):
4545
# XXX Circle back to this later.
4646
raiseTypeError('scripts not supported')
4747
else:
48-
# Functions defined in the __main__ module can't be pickled,
49-
# so they can't be used here. In the future, we could possibly
50-
# borrow from multiprocessing to work around this.
5148
task= (fn,args,kwargs)
52-
data=pickle.dumps(task)
53-
returndata
49+
returntask
5450

5551
ifinitializerisnotNone:
5652
try:
@@ -65,35 +61,6 @@ def create_context():
6561
returncls(initdata,shared)
6662
returncreate_context,resolve_task
6763

68-
@classmethod
69-
@contextlib.contextmanager
70-
def_capture_exc(cls,resultsid):
71-
try:
72-
yield
73-
exceptBaseExceptionasexc:
74-
# Send the captured exception out on the results queue,
75-
# but still leave it unhandled for the interpreter to handle.
76-
_interpqueues.put(resultsid, (None,exc))
77-
raise# re-raise
78-
79-
@classmethod
80-
def_send_script_result(cls,resultsid):
81-
_interpqueues.put(resultsid, (None,None))
82-
83-
@classmethod
84-
def_call(cls,func,args,kwargs,resultsid):
85-
withcls._capture_exc(resultsid):
86-
res=func(*argsor (),**kwargsor {})
87-
# Send the result back.
88-
withcls._capture_exc(resultsid):
89-
_interpqueues.put(resultsid, (res,None))
90-
91-
@classmethod
92-
def_call_pickled(cls,pickled,resultsid):
93-
withcls._capture_exc(resultsid):
94-
fn,args,kwargs=pickle.loads(pickled)
95-
cls._call(fn,args,kwargs,resultsid)
96-
9764
def__init__(self,initdata,shared=None):
9865
self.initdata=initdata
9966
self.shared=dict(shared)ifsharedelseNone
@@ -104,11 +71,42 @@ def __del__(self):
10471
ifself.interpidisnotNone:
10572
self.finalize()
10673

107-
def_exec(self,script):
108-
assertself.interpidisnotNone
109-
excinfo=_interpreters.exec(self.interpid,script,restrict=True)
74+
def_call(self,fn,args,kwargs):
75+
defdo_call(resultsid,func,*args,**kwargs):
76+
try:
77+
returnfunc(*args,**kwargs)
78+
exceptBaseExceptionasexc:
79+
# Avoid relying on globals.
80+
import_interpqueues
81+
# Send the captured exception out on the results queue,
82+
# but still leave it unhandled for the interpreter to handle.
83+
_interpqueues.put(resultsid,err)
84+
raise# re-raise
85+
86+
args= (self.resultsid,fn,*args)
87+
res,excinfo=_interpreters.call(self.interpid,do_call,args,kwargs)
11088
ifexcinfoisnotNone:
11189
raiseExecutionFailed(excinfo)
90+
returnres
91+
92+
def_get_exception(self):
93+
# Wait for the exception data to show up.
94+
whileTrue:
95+
try:
96+
excdata=_interpqueues.get(self.resultsid)
97+
except_interpqueues.QueueNotFoundError:
98+
raise# re-raise
99+
except_interpqueues.QueueError:
100+
continue
101+
exceptModuleNotFoundError:
102+
# interpreters.queues doesn't exist, which means
103+
# QueueEmpty doesn't. Act as though it does.
104+
continue
105+
else:
106+
break
107+
exc,unboundop=excdata
108+
assertunboundopisNone,unboundop
109+
returnexc
112110

113111
definitialize(self):
114112
assertself.interpidisNone,self.interpid
@@ -148,37 +146,12 @@ def finalize(self):
148146
pass
149147

150148
defrun(self,task):
151-
data=task
152-
script=f'WorkerContext._call_pickled({data!r},{self.resultsid})'
153-
149+
fn,args,kwargs=task
154150
try:
155-
self._exec(script)
156-
exceptExecutionFailedasexc:
157-
exc_wrapper=exc
158-
else:
159-
exc_wrapper=None
160-
161-
# Return the result, or raise the exception.
162-
whileTrue:
163-
try:
164-
obj=_interpqueues.get(self.resultsid)
165-
except_interpqueues.QueueNotFoundError:
166-
raise# re-raise
167-
except_interpqueues.QueueError:
168-
continue
169-
exceptModuleNotFoundError:
170-
# interpreters.queues doesn't exist, which means
171-
# QueueEmpty doesn't. Act as though it does.
172-
continue
173-
else:
174-
break
175-
(res,exc),unboundop=obj
176-
assertunboundopisNone,unboundop
177-
ifexcisnotNone:
178-
assertresisNone,res
179-
assertexc_wrapperisnotNone
180-
raiseexcfromexc_wrapper
181-
returnres
151+
returnself._call(fn,args,kwargs)
152+
exceptExecutionFailedaswrapper:
153+
exc=self._get_exception()
154+
raiseexcfromwrapper
182155

183156

184157
classBrokenInterpreterPool(_thread.BrokenThreadPool):

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp